标题:有关JS的变量作用域和this指针的讨论
1. 变量作用域
1.1 作用域是什么
在JS中,作用域可以理解为变量的有效范围。JS支持两种作用域:全局作用域和函数作用域。
全局作用域是指整个JS文件,其内定义的变量可以被文件中任何一个函数所使用。
函数作用域是指只在函数体内部(包括函数体内嵌套的函数中)定义的变量。这些变量只在函数体内及其内部的函数中有效。
1.2 变量声明提前
在JS中,变量可以在使用前先声明。这是因为JS中存在变量声明提前的机制,即JS在运行时会将函数中声明的变量提前至函数的顶部。
示例代码:
function test(){
console.log(a); // undefined
var a = 10;
console.log(a); // 10
}
test();
1.3 块级作用域
在ES6中,引入了块级作用域。块级作用域是指if、for、while等语句的{}内(即花括号内)定义的变量,在语句外部无法访问,但在语句内部可以。
示例代码:
var a = 10;
if(true){
var a = 20;
let b = 30;
}
console.log(a); // 20
console.log(b); // Uncaught ReferenceError: b is not defined
2. this指针
2.1 this是什么
在JS中,this指针用于引用当前正在执行的函数所属的对象。this指针的实际指向是在函数被调用时确定的。
2.2 函数调用方式对this的影响
函数的调用方式有以下几种:
- 作为普通函数调用
当函数作为普通函数来调用时,this指向全局对象。在浏览器环境下,全局对象就是window对象;在Node.js环境下,全局对象就是global对象。
javascript
function test(){
console.log(this);
}
test(); // window
- 作为对象方法调用
当函数作为对象方法来调用时,this指向调用该方法的对象。
javascript
var obj = {
name: 'Tom',
sayName: function(){
console.log(this.name);
}
};
obj.sayName(); // "Tom"
- 作为构造函数调用
当函数作为构造函数来调用时,this指向新创建的对象。
javascript
function Person(name){
this.name = name;
}
var p = new Person('Tom');
console.log(p.name); // "Tom"
- 使用apply、call或bind方法调用
当使用apply、call或bind方法来调用函数时,this指向调用该方法时传入的第一个参数。
javascript
var obj1 = {
name: 'Tom'
};
var obj2 = {
name: 'Jerry'
};
function test(){
console.log(this.name);
}
test.apply(obj1); // "Tom"
test.call(obj2); // "Jerry"
var f = test.bind(obj1);
f(); // "Tom"
2.3 箭头函数中的this
在箭头函数中,this指向的是包含箭头函数的函数的this指针,而不是箭头函数自己的this指针。
示例代码:
var obj = {
name: 'Tom',
sayName: function(){
var func = ()=>console.log(this.name);
func();
}
};
obj.sayName(); // "Tom"
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:有关js的变量作用域和this指针的讨论 - Python技术站