当前的执行上下文。值和表达式在其中 “可见” 或可被访问到的上下文。如果一个变量或者其他表达式不 “在当前的作用域中”,那么它就是不可用的。 作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。
一个函数在 JavaScript 中充当闭包,从而创建一个作用域。只定义在函数中变量,外部作用域或其他函数无法访问。
function exampleFunction() {
var x = "declared inside function";
console.log("Inside function");
console.log(x);
}
console.log(x);
如下代码是可以正常运行的,因为 变量 x 是在 父 scope 中申明的
var x = "declared outside function";
exampleFunction();
function exampleFunction() {
console.log("Inside function");
console.log(x);
}
console.log("Outside function");
console.log(x);
在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this 不能在执行期间被赋值,并且在每次函数被调用时 this 的值也可能会不同。ES5 引入了 bind 方法来设置函数的 this 值,而不用考虑函数如何被调用的。ES2015 引入了箭头函数,箭头函数不提供自身的 this 绑定(this 的值将保持为闭合词法上下文的值)。
const obj = {
name: 'obj',
say: function() {
console.log(this.name);
}
}
obj.say();
b = {name: 'b'};
b.say = obj.say;
b.say();
s1 = obj.say.bind({name: 'c'});
s1();
function f1(){
return this;
}
f1() === window;
f1() === globalThis;
- 箭头函数中的this
在箭头函数中,this与封闭词法环境的this保持一致。在全局代码中,它将被设置为全局对象:
var obj = {
bar: function() {
var x = (() => this);
return x;
}
};
var fn = obj.bar();
console.log(fn() === obj);
var fn2 = obj.bar;
console.log(fn2()() == window);
|