JS 中在严格模式下 this 的指向问题
在 JavaScript 中,严格模式(strict mode)是一种更加严格的代码执行模式,它对一些不规范的语法和行为进行了限制。在严格模式下,this 的指向会有一些变化,下面将详细讲解这个问题。
1. 默认情况下的 this 指向
在非严格模式下,默认情况下,this 的指向取决于函数的调用方式。具体规则如下:
- 如果函数是作为对象的方法调用,this 指向调用该方法的对象。
- 如果函数是作为普通函数调用,this 指向全局对象(在浏览器环境中是 window 对象)。
- 如果函数是作为构造函数调用,this 指向新创建的实例对象。
- 如果函数通过 apply() 或 call() 方法调用,this 指向作为参数传递的对象。
示例 1:
var obj = {
name: 'Alice',
sayHello: function() {
console.log('Hello, ' + this.name);
}
};
obj.sayHello(); // 输出:Hello, Alice
示例 2:
function sayHello() {
console.log('Hello, ' + this.name);
}
var name = 'Bob';
sayHello(); // 输出:Hello, Bob
2. 严格模式下的 this 指向
在严格模式下,this 的指向有一些变化:
- 如果函数是作为对象的方法调用,this 仍然指向调用该方法的对象。
- 如果函数是作为普通函数调用,this 指向 undefined。
- 如果函数是作为构造函数调用,this 指向新创建的实例对象。
- 如果函数通过 apply() 或 call() 方法调用,this 指向作为参数传递的对象。
示例 3:
'use strict';
var obj = {
name: 'Alice',
sayHello: function() {
console.log('Hello, ' + this.name);
}
};
obj.sayHello(); // 输出:Hello, Alice
var sayHello = obj.sayHello;
sayHello(); // 输出:TypeError: Cannot read property 'name' of undefined
示例 4:
'use strict';
function sayHello() {
console.log('Hello, ' + this.name);
}
var name = 'Bob';
sayHello(); // 输出:TypeError: Cannot read property 'name' of undefined
以上就是在严格模式下 this 的指向问题的详细讲解。请注意,在严格模式下,如果函数的 this 指向为 undefined,访问 this 的属性会导致 TypeError。因此,在编写代码时,需要特别注意 this 的使用情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 中在严格模式下 this 的指向问题 - Python技术站