如何在执行上下文的创建阶段加载 javascript 对象和 javascript 函数



我仍在探索JavaScript的奇怪部分,我遇到了这个问题。

我知道所有变量最初都在执行上下文的创建阶段设置为未定义,但函数会完整地加载到内存中。所有函数都是javascript中的对象。因此,当我编写以下代码时,它没有给出令人满意的结果。

//Code-1
console.log(fun1.exp);
function fun1(){
    console.log("Hi");
}
fun1.exp = "funnn";

//Code-2
console.log(obj.name);
var obj = {
    "name" : "Albert"
};

代码 1 的输出:

定义

代码 2 的输出:

捕获的类型错误:无法读取未定义的属性"名称">

预期:当两者都是对象时,它们的输出不应该相同吗?

函数声明被提升,但任何涉及赋值(=(的东西都不会。对于解释器来说,你的第一个代码相当于

function fun1(){
  console.log("Hi");
}
// END OF HOISTING OF FUNCTION DECLARATIONS
console.log(fun1.exp);
fun1.exp = "funnn";

fun1.exp线在console.log之后运行,因此fun1.exp在记录时是undefined的。

您的第二个代码相当于

// END OF HOISTING OF FUNCTION DECLARATIONS
// (no hoisting at all here, since there are no function declarations)
console.log(obj.name);
var obj = {
  "name" : "Albert"
};

普通对象不会被提升;只有函数声明(使用 function 关键字且缺少=的函数(被提升。

最新更新