bind,call,apply模拟实现】的更多相关文章

大家好!!!注册一年多的第一篇博客. 自我介绍: 本人非计算机专业出身,转行进入前端半年时间,写的东西可能观赏性不强,一起进步吧道友们... 接下来的一段时间, 我都会不定期整理自己理解的js知识点, 欢迎各路道友吐槽. 进入正题......  (针对新手,老司机不要嘲笑我) 首先, bind/call/apply 这改变this指向的三兄弟我们都很熟悉了, 还有其他改变this指向的方法这里就不多说了哈,要不就跑题了.... 你需要知道的前提 : 这三货都是函数原型(Function.prot…
bind.apply与call 先说观点:不论是bind.apply还是call,最大的好处就是代码复用. bind 在开发中,我们只有复用代码时,才会出现this指向需要改动的情况. 纵观bind的常用方法,不论是偏函数还是快捷调用等等,即使是setTimeout,也都是希望能把别的地方的方法拿过来用,才会出现this指向不对的情况. 一言以蔽之:因为是面向对象,才会出现绑定this的需要. 这话并不是空穴来风,面向对象的好处就在于抽象程度高,封装好的一个类,可以在不改变源码的情况下,经过一些…
1)bind与apply.call 的最大区别就是:bind不会立即调用,其他两个会立即调用 var fn = { _int: function(){return 3}, fun: function(){ $(id).click(function() { console.log(this._int()) }).bind(this); } } 2)apply和call的区别 语法: function.apply(thisObj, [obj1,obj2,obj3,...]); function.ca…
首先看一道网易的面试题: var a = { a:"haha", getA:function(){ console.log(this.a); } } var b = { a:"hello" } var getA = a.getA; var getA2 = getA.bind(a); function run(fn){ fn(); } //分别输出 a.getA();//haha getA();//window下面的a对象 run(a.getA);//window下面…
bind call apply 的区别和使用:https://www.jianshu.com/p/015f9f15d6b3 在讲这个之前要理解一些概念,这些概念很重要,有人说过学会了javascript 的this 就基本会了一半的javascript 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是函数存在: 定义时上下文运行时上下文上下…
自己手动用原生实现bind/call/apply:https://www.cnblogs.com/LHLVS/p/10595784.html…
一.前言    不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数,但是多少也和this有点关联. 假如在前面那场面试末尾,面试官不依不饶继续问你javascript中的this,那看完本篇文章后一定还会有收获. (本篇文章不会站在this的角度去回答问题,而是重于解释bind.apply和call这三个函数的用法和使用场景) 二.正戏开始 面试官:能解释一下javascr…
也谈如何实现bind.apply.call 我们知道,JavaScript的bind.apply.call是三个非常重要的方法.bind可以返回固定this.固定参数的函数包装:apply和call可以修改成员函数this的指向.实现bind.apply.call是前端面试的高频问题,也能让我们更好地理解和掌握JavaScript的函数的相关知识.本文将介绍如何自行实现bind.apply和call. 前情提要 本文先给出如下类定义和实例定义. // Person类,每个人有姓名,有打印姓名的方…
this 是 js 里绕不开的话题,也是非常容易混淆的概念,今天试着把它理一理. this 在非严格模式下,总是指向一个对象,在严格模式下可以是任意值,本文仅考虑非严格模式.记住它总是指向一个对象对于理解它的意义很重要.this 在实际使用中,大致分为以下几种情况: 1. 函数作为对象的方法调用时,this 指向调用该函数的对象 var obj = { name: 'jack', getName: function() { console.log(this === obj) // true co…
js修改函数内部的this指向 在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向. 默认在浏览器下script标签内定义的函数,调用的时候函数内部的this指向window(浏览器窗口对象) <script> var a=2 function hello(){ console.log(this) console.log(this.a) } hello() //输出: window…
1.bind.apply与call的区别与使用 相同点:2者是函数原型的一个方法,因此调用者都必须是函数,第1个参数都是对象.作用是,用另一个对象替换当前对象,另一对象也即是你传的第一个参数.通常用于改变调用的函数中this的指向.如果不传对象或者传入的为null,那么默认对象就是window.bind方法是函数的方法,也是改变this的指向,返回新的函数. 不同点:第2个参数,为调用的函数的参数,区别是apply要求所有函数的参数放在一个数组中传递. 使用方法: fun.bind(thisAr…
先了解下bind call apply 的注意点 bind 需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 call 不需要手动调用 第一个参数 this 要指向的对象,后面是 散列的参数 apply 不需要手动调用 第一个参数 this 要指向的对象,后面是 数组参数 看下具体代码 bind function fn(a,b) { console.log(a,b) console.log(this,'this') } fn(1,2) // 1 2 // Window 'th…
this的指向问题 全局作用域下的this指向 无论是否是严格模式,全局作用域下的this始终指向window 函数内部的this 严格模式下: function test() { 'use strict' console.log(this) } test(); // undefined window.test(); // window 非严格模式下: function test() { console.log(this) } test(); // window window.test(); /…
首先,三者第一个参数都为this指向 区别 bind返回的是一个函数体 call和apply会直接执行,但是call参数需要一个一个进行传递,apply的第二个参数是一个数组 实现 bind 简单实现 Function.prototype.myBind = function(context){ self = this; //保存this,即调用bind方法的目标函数 return function(){ return self.applay(context, [...arguments]); }…
扩展Function原型方法,此处用myBind来模拟bind实现 Function.prototype.myBind = function(o /*,args*/){       //闭包无法获取this关键字,故用self进行保存 var self = this; var boundArgs = arguments;        //返回闭包指针,则闭包的作用域(o和其他arguments)将被保存        return function(){            var Args…
参考: http://rangercyh.blog.51cto.com/1444712/1615809 function foo(a,b) { this.x = this.x + a + b; } //case 1: var obj = {x:3}; foo.apply(obj,[1,2]); //obj <==> {x:6} //case 2: var obj = {x:3}; foo.call(obj, 1, 2); //obj <==> {x:6} //case 3: var…
this的指向由调用时决定而不是定义时决定,定义的方式: //直接定义在函数里 var a="window中的a"; var name="window"; function aa(args1,args2){ console.log(this.a+args1+args2); } aa(); //this=window //定义在对象中 var o={ a:"o中的aaa", name:"nicole", print:functi…
1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 banana对象 但是没有say方法 我们可以通过call 或者apply用apple的say方法. 直接传入banana进去 使得this指向banana对象. apply和 call 本质上完全一样 只是 接收的参数不一样 call把参数(参数个数是确定的)逐个放进去.而apply的参数(参数是不…
关于这3个货,网上有很多文章介绍,我这边还是记录下并加上自己的理解,还有arguments函数内置对象顺便也记录下: 简单的说apply和call 会绑定第一个参数的作用域给调用函数对象实例,并会执行调用函数,还可以传参数 apply 第二个参数是数组,call 是可变长度参数 apply.call: 例子来个: function x(t,v){ console.log(this.id); if(t){ console.log(t); } if(v){ console.log(v); } } v…
先介绍每个的语法: 1. bind() 语法:fn.bind(thisObj[, arg1[, arg2[, ...]]]) fn:是想要改变this指向的函数 thisObj:表示fn中this指针指向的新对象.可选. 作用:改变this指向,并返回一个函数. 后面的参数:看似复杂,实际上就相当于一个一个列出来,即fn.bind(thisObj, arg1, arg2, ...).参数也可以为单独的数组,例如:fn.bind( thisObj,1,2,[3,34] );.可选 注意: 这个方式…
一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!以前总是死记硬背:call.apply.bind 都是用来修改函数中的this,传参时,call是一个个传参,apply是数组形式传参,call和apply立即执行并且返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined.bind是改变this后返回一个新的函数,他不会立即执行.死记硬背的结果就是:总以为这三个方法改变了原方法的this,原方法的this就永久改变了!大错特错啊!! 1…
call方法的实现 Function.prototype.MyCall = function(content,...args){ const self = content || window; const args = args.slice(1) const self.fn = this const result = self.fn(args) delete self.fn return result } apply方法实现,和call方法差不多 Function.prototype.MyApp…
function cat(){}cat.prototype={ food:"fish", say: function(){ alert("I love "+this.food); }}var blackCat = new cat;blackCat.say(); 但是如果我们有一个对象whiteDog = {food:"bone"},我们不想对它重新定义say方法,那么我们可以通过call或apply用blackCat的say方法:blackCat…
介绍 在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是this要指向的对象. 3.都可以利用后续参数传参. 那么他们的区别在哪里的,先看一个例子. var xw = { name : "小王", gender : "男", age : 24, say : function() { alert(this.name + "…
//实现call var that = this ; //小程序环境 function mySymbol(obj){ let unique = (Math.random() + new Date().getTime()).toString(32).slice(0,8); if(obj.hasOwnProperty(unique)){ return mySymbol(obj) }else { return unique; } } let Person = { name:'Tom', say(age…
目录 引子 隐式丢失 硬绑定 实现及原理分析 总体实现(纯净版/没有注释) 写在最后 引子 读完<你不知道的JavaScript--上卷>中关于this的介绍和深入的章节后,对于this的指向我用这篇文章简单总结了一下.接着我就想着能不能利用this的相关知识,模拟实现一下javascript中比较常用到的call.apply.bind方法呢? 于是就有了本文,废话不多说全文开始! 隐式丢失 由于模拟实现中有运用到隐式丢失, 所以在这还是先介绍一下. 隐式丢失是一种常见的this绑定问题, 是…
apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了改变函数内部this的指向):   如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是一个参数数组,call的第二个及其以后的参数都是数组里面的元素,就是说要全部列举出来:   他们的常用用法: 1.数组之间的追加: 2.获取数组中的最大值和最小值,利用他们扩充作用域拥有Math的min和max方法: 由于没有什么对象调用这个方法,所以第一个参数可以写作null或者本身: var …
1.简单说一下bind.call.apply的区别 三者都是用于改变函数体内this的指向,但是bind与apply和call的最大的区别是:bind不会立即调用,而是返回一个新函数,称为绑定函数,其内的this指向为创建它时传入bind的第一个参数,而传入bind的第二个及以后的参数作为原函数的参数来调用原函数. var obj = {}; function test() { console.log(this === obj); } test(); //false var testObj =…
#call, apply, bind 区别及模拟实现call apply bind 三者都可以用来改变this的指向,但是在用法上略有不同  首先说一下call和apply的区别 call和apply都是第一个参数是this的指向  ,只是传参的方式不同 call是 第二个以及第三依次类推都是当前函数的参数,每个参数用逗号相隔开 而apply则是将所有的参数以数组的形式来传递的  call(window,参数1,参数1,参数3) call和apply与bind的区别 call和apply相当于立…
总结 call().apply()和bind()都是用来改变函数执行时的上下文,可借助它们实现继承:call()和apply()唯一区别是参数不一样,call()是apply()的语法糖:bind()是返回一个新函数,供以后调用,而apply()和call()是立即调用. 我是怎么记的 apply是a开头跟array的a开头一致,所以apply的参数是数组的,其余两个call 和 bind的参数就不需要记忆了,都是多参数类型. 详解 js中的call(), apply()和bind()是Func…