JS基础——call、bind、apply 和 this
栏目: JavaScript · 发布时间: 6年前
内容简介:首先我们分析一下下面代码的执行结果执行结果如下:由此可见
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 ,在浏览器 工具 中可以清晰的看到函数的调用栈:
foo函数的调用位置在test函数中,此时this的指向 默认绑定 为window,而不是foo对象。我们可以可以通过修改 this.count 为 foo.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 绑定
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
卓有成效的程序员
Neal Ford / 熊节 / 机械工业出版社 / 2009-3 / 45.00元
《卓有成效的程序员》就是讲述如何在开发软件的过程中变得更加高效。同时,《卓有成效的程序员》的讲述将会跨语言和操作系统:很多技巧的讲述都会伴随多种程序语言的例子,并且会跨越三种主要的操作系统,Windows(多个版本),Mac OS X以及 *-nix (Unix或者Linux)。 《卓有成效的程序员》讨论的是程序员个体的生产力,而不是团队的生产力问题,所以它不会涉及方法论(好吧,可能总会在......一起来看看 《卓有成效的程序员》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
html转js在线工具
html转js在线工具