JavaScript提升解释

Sna*_*gon 47 javascript

下面的代码片段有什么区别?

var a = 0;
function b(){
    a = 10;
    return function a(){};
}
b();
console.log(a);  // => 10
Run Code Online (Sandbox Code Playgroud)

var a = 0;
function b(){
    a = 10;
    return
    function a(){};
}
b();
console.log(a);  // => 0
Run Code Online (Sandbox Code Playgroud)

它与JavaScript提升有关,但我对这个概念的理解恰恰相反.

dec*_*eze 56

return function a(){};
Run Code Online (Sandbox Code Playgroud)

function ...是一个表达.甲命名函数表达式要精确.在a这里并没有多大关系,它只是提供了匿名函数.name,但它仍然只是你返回一个函数表达式.

return 
function a(){};
Run Code Online (Sandbox Code Playgroud)

这相当于:

return;
function a(){};
Run Code Online (Sandbox Code Playgroud)

function a是一个声明,而不是表达.它被悬挂,a在范围内创建一个本地名称,遮蔽外部a.即它相当于:

function b(){
    var a = function () {};
    a = 10;
    return;
}
Run Code Online (Sandbox Code Playgroud)


Tus*_*har 26

return
function a() {}
Run Code Online (Sandbox Code Playgroud)

和...一样

return;
function a() {}
Run Code Online (Sandbox Code Playgroud)

自动分号插入后.在第二种情况下,函数a被移动到其范围的顶部.代码与.相同

var a = 0;

function b() {
  function a() {};
  a = 10;
  return;
}
b();
console.log(a);
Run Code Online (Sandbox Code Playgroud)

由于a内部b()是内部函数然后覆盖,因此无法从外部访问b().

以下是了解吊装如何工作的演示.

var a = 0;

function b() {
  console.log(a); // function
  a = 10;
  console.log(a); // 10
  return

  function a() {};
}
console.log(b()); // undefined
console.log(a);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3029 次

最近记录:

7 年,7 月 前