alert(myVar1);
return false;
var myVar1;
Run Code Online (Sandbox Code Playgroud)
上面的代码在IE,FF和Opera中引发错误,说明return语句必须进入函数.但它undefined在Safari和Chrome中有效(显示).
上面的代码已经在全球范围内编写.在所有功能之外.
任何原因?
我对解释器的理解是它逐行执行程序,我们可以看到即时结果,不像转换代码的编译语言,然后执行它.
我的问题是,在Javascript中,解释器如何知道变量是在程序中的某个地方声明并将其记录为undefined?
考虑下面的程序:
function do_something() {
console.log(bar); // undefined (but in my understanding about an interpreter, it should be throwing error like variable not declared)
var bar = 111;
console.log(bar); // 111
}
Run Code Online (Sandbox Code Playgroud)
被隐含地理解为:
function do_something() {
var bar;
console.log(bar); // undefined
bar = 111;
console.log(bar); // 111
}
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
前几天,我接受了一次采访,其中一个问题是“什么是吊装?” 然后我把吊装的概念讲得很透彻,然后面试官问我,吊装的主要优点是什么?我无法回答。javascript 中提升的主要优点到底是什么?
我最近一直在学习很多Javascript,而且我一直在努力理解提升变量的价值(如果有的话).
我理解(现在)JS是一个双程系统,它编译然后执行.另外,我理解var关键字'exists'在它声明的词法范围内,因此如果在引擎分配值之前调用它,那么为什么它是'undefined'.
问题是,为什么这甚至重要?有什么用途可以提升你不能不提升的变量?我觉得它只会创建不太可读的代码而没有收获......
是否存在提升变量有用的示例?
在遵循Kyle Simpson 在Pluralsight上的Advanced JavaScript 时,我遇到了这段代码,它应该证明函数声明在变量声明之前得到(预)编译:
foo();
var foo = 2;
function foo() { console.log("bar"); }
function foo() { console.log("foo"); }
Run Code Online (Sandbox Code Playgroud)
(请注意,上面的代码要么输入一行有空格而不是换行符,要么使用SHIFT+ENTER防止在输入整个代码之前立即执行。)在Node中输入上面整个代码的立即结果或 (Chrome) 控制台(并按 Enter 键)是:
foo
< undefined
Run Code Online (Sandbox Code Playgroud)
解释 Kyle 的解释,第一个function foo声明被第二个覆盖,因此foo输出到控制台,并且由于foo已经声明为函数,var foo因此(预)编译器忽略该声明。
眼前的结果支持了理论忽略,然而,随后的调查foo和foo()展示一个不同的故事:
> foo
2
> foo()
Uncaught TypeError: foo is not a function
>
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么以及何时被忽略的声明var foo = 2;生效,当立即执行产生时:
foo
< undefined
Run Code Online (Sandbox Code Playgroud)
我的理解是 JavaScript 引擎(预)编译解析步骤应该注意两个函数的声明,然后是变量的声明,按照这个顺序,然后,在执行步骤,foo(); …