function foo() { console.log(this.a); } var a = 2 foo(); // 2
function foo() { ‘use strict‘; console.log(this.a); } var a = 2 foo(); // TypeError: Cannot read property ‘a‘ of undefined
function foo() { console.log(this.a); } var a = 2; (function(){ ‘use strict‘; foo(); //2 })()
通常代码中不应该混用严格模式和非严格模式,整个程序要么严格,要么非严格。
function foo() { console.log(this.a); } var obj = { a: 2, foo: foo } obj.foo(); // 2
function foo() { console.log(this.a); } var obj2 = { a: 42, foo: foo } var obj1 = { a: 2, obj2: obj2 } obj1.obj2.foo(); // 42
一个最常见的 this 绑定问题是被隐式绑定的函数会丢失绑定对象,从而绑定到全局对象,严格模式下绑定到 undefined
function foo() { console.log(this.a); } var obj = { a: 2, foo: foo } var bar = obj.foo; // 函数别名! var a = ‘oops, global‘; // a 是全局变量 bar(); // ‘oops, global‘
虽然 bar 是 obj.foo 的一个引用,但是实际下,它引用的是 foo 本身。因此应用了默认绑定
function foo() { console.log(this.a); } function doFoo(fn){ fn(); // 调用位置 } var obj = { a: 2, foo: foo } var a = ‘oops, global‘; // a 是全局变量 doFoo(obj.foo); // ‘oops, global‘
参数传递是隐式赋值,因此我们传入函数也会被隐式赋值。
function foo() { console.log(this.a); } var obj = { a: 2, foo: foo } var a = ‘oops, global‘; // a 是全局变量 setTimeout(obj.foo, 100) // ‘oops, global‘
传入语言内置的函数也是一样的,没有区别
你不知道的JS系列 ( 20 ) - this绑定规则(默认绑定,隐式绑定)
原文:https://www.cnblogs.com/wzndkj/p/12418175.html