1. O que é escopo?
Em Javascript, os escopos são divididos em e 全局作用域
函数作用域
-
Escopo global: o código pode ser acessado em qualquer lugar do programa e as propriedades internas do objeto janela pertencem ao escopo global
-
Escopo da função: só pode ser acessado em fragmentos de código fixos
O escopo possui uma relação superior-subordinado, e a determinação da relação superior-subordinado depende do escopo em que a função é criada. Como acima, a função de barra é criada sob o escopo fn, então o "escopo fn" é o superior do "escopo de barra".
A maior utilidade do escopo é isolar variáveis, e variáveis com o mesmo nome em escopos diferentes não entrarão em conflito.
2. Qual é a cadeia de escopo?
Em geral, uma variável obtém seu valor no escopo da função que criou a variável
No entanto, se nenhum valor for encontrado no escopo atual, ele será verificado no escopo superior até que o escopo global seja encontrado.A cadeia formada por esse processo de pesquisa é chamada de cadeia de escopo.
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x = 20;
f(); // 10
}
show(fn);
três.isso
this
Uma palavra-chave é um objeto interno gerado automaticamente quando a função está sendo executada, ela só pode ser usada dentro da função e sempre aponta para o objeto que a chama.
1. Exemplo 1
function baz() {
// 当前调用栈是:baz
// 因此,当前调用位置是全局作用域
console.log("baz");
bar(); // <-- bar的调用位置
}
function bar() {
// 当前调用栈是:baz --> bar
// 因此,当前调用位置在baz中
console.log("bar");
foo(); // <-- foo的调用位置
}
function foo() {
// 当前调用栈是:baz --> bar --> foo
// 因此,当前调用位置在bar中
console.log("foo");
}
baz(); // <-- baz的调用位置
2. this
Durante a execução da função, this
uma vez determinada, não pode ser alterada
var a = 10;
var obj = {
a: 20
}
function fn() {
this = obj; // 修改this,运行后会报错
console.log(this.a);
}
fn();
Quatro. estas regras vinculativas
(1) Ligação padrão (exclua primeiro o modo estrito)
var name = 'Jenny';
function person() {
return this.name;
}
console.log(person()); //Jenny
//调用函数的对象在游览器中位window,因此this指向window,所以输出Jenny
(2) Ligação implícita - a função também pode ser chamada como um método de um objeto, que this
se refere ao objeto superior
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m(); // 1
Esta função contém vários objetos. Embora esta função seja chamada pelo objeto mais externo, ela this
apenas aponta para o objeto de seu nível superior.
var o = {
a: 10,
b: {
fn: function () {
console.log(this);// fn:ƒ()
console.log(this.a); //undefined
}
}
}
o.b.fn();
Neste momento , this
ele aponta para window
, o que precisa ser lembrado é que this
ele sempre aponta para o objeto que o chamou por último. Embora fn
seja o método do objeto b
, ele não é executado quando fn
é atribuído a , então ele finalmente aponta paraj
window
(3) Modificação explícita
apply()、call()、bind()
É um método da função e sua função é alterar o objeto de chamada da função. Seu primeiro parâmetro representa o objeto alterado que chama essa função. Portanto, this
refere-se a este primeiro parâmetro neste momento.
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply(obj) // 1