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

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

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

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 绑定


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

查看所有标签

猜你喜欢:

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

Usability for the Web

Usability for the Web

Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95

Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具