JS基础——call、bind、apply 和 this

栏目: JavaScript · 发布时间: 5年前

内容简介:首先我们分析一下下面代码的执行结果执行结果如下:由此可见

this

首先我们分析一下下面代码的执行结果

function foo(num) {
     console.log( "foo: " + num );
     this.count++;  //记录函数执行次数
}
foo.count = 0;
function test(){
    for(let i = 0 ; i < 4; i++){
        foo(i)
    }
    console.log('foo执行次数:'+foo.count)
}
test()

执行结果如下:

foo: 0
foo: 1
foo: 2
foo: 3
foo执行次数:0

由此可见 this指向的并不是函数自身 。this 是在运行时进行绑定的,它的指向取决于它的 调用位置 。我们可以通过分析 调用栈 来找到函数的调用位置。(调用位置为当前正在执行的函数的前一个调用中)。当我们在第一个例子中增加 debugger ,在浏览器 工具 中可以清晰的看到函数的调用栈:

JS基础——call、bind、apply 和 this

foo函数的调用位置在test函数中,此时this的指向 默认绑定 为window,而不是foo对象。我们可以可以通过修改 this.countfoo.count 来达到目的。

绑定

this的绑定规则有:默认绑定、隐式绑定、显式绑定、new绑定,上面函数调用中this就是默认绑定。

new绑定

function foo(a) { 
 this.a = a;
} 
var bar = new foo(2);
console.log(bar.a);  //2
var bar2 = new foo(3);
console.log(bar2.a)   //3

当使用new调用foo函数时,会构造一个新对象并把它绑定到 foo

显式绑定

我们可以通过call、bind、apply来改变this的指向。 call、apply本质上没有区别,都是立即执行,只是第二个参数的传值方式不一样。bind返回要执行的函数,需要的时候再执行。(bind后的函数当使用new执行时,绑定无效)

function foo() { 
     console.log(this.a);
}
var obj = { 
     a:2
};
var fn = foo.bind( obj );
fn()   //2
new fn()  //undefined

隐式绑定

当函数存在上下文对象时会影响调用位置

function foo() { 
 console.log( this.a );
}
var obj2 = { 
 a: 42,
 foo: foo 
};
var obj1 = { 
 a: 2,
 obj2: obj2 
};
obj1.obj2.foo();  //42

箭头函数

箭头函数会继承外层函数调用的 this 绑定


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

小米之道

小米之道

(美)克莱•舍基 / 张琪 / 浙江人民出版社 / 2017-10-1 / 49.90元

共享经济、自媒体预言者,“互联网先知”克莱·舍基,继《认知盈余》《人人时代》后,聚焦风口上的小米。资深科技商业观察家金错刀、润米咨询创始人刘润作序推荐。附多篇雷军内部讲话,详细解读成功完成“筑底”后小米的全新商业模式 纵观中国互联网发展史,可以明显发现,本土互联网企业的崛起,几乎都是先引入国外商业模式,然后通过强化本土化特点来构筑自己的壁垒。在这种背景下,小米是名副其实的新物种,它走的是相反......一起来看看 《小米之道》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具