我知道Javascript创建全局执行上下文并将它们放在执行堆栈上并经历两个阶段,创建阶段和执行阶段,在第二阶段,当它发现正在调用的函数时,它会创建另一个执行上下文并将其放入执行堆栈顶部的执行上下文,并重复相同的事情,一旦函数中的代码完成执行,它弹出堆栈顶部,返回到堆栈下面的执行上下文。 但我的问题是Javascript如何处理条件语句或循环的代码块?
if (true) {
//this is not the right way to write code.
var var1 = 1;
var var2 = 2;
var3 = 3;
function someFunction(arg1, arg2) {
//code
}
someFunction('value1', 'value2');
}
当Javascript引擎进入条件语句或循环的代码块时,它是否会做同样的事情? 它实际上是做什么的?
答案 0 :(得分:1)
使用var
和function
声明的变量具有函数作用域,而不是块作用域。所以,如果你写:
function foo() {
if (true) {
//this is not the right way to write code.
var var1 = 1;
var var2 = 2;
var3 = 3;
function someFunction(arg1, arg2) {
//code
}
someFunction('value1', 'value2');
}
}
变量声明被提升到函数的顶部。但是,在代码流程中出现的分配仍然完成。就像你写的一样。
function foo() {
var var1, var2, someFunction;
if (true) {
//this is not the right way to write code.
var1 = 1;
var2 = 2;
var3 = 3;
someFunction = function(arg1, arg2) {
//code
}
someFunction('value1', 'value2');
}
}
但是,如果您使用EcmaScript-6 let
或const
关键字声明变量,则它们具有块范围且不会被提升。
答案 1 :(得分:0)
但我的问题是Javascript如何处理条件语句或循环的代码块?
传统上,这些块不会得到它们自己的作用域,这意味着你不能在它们中声明局部变量(它们会被提升为函数级)。
对于来自其他编程语言的人来说,这种行为是非常意外的,并且导致了无端的错误。
为了缓解这种情况,现在(ECMAScript 6)有一个let
keyword,允许您声明各个代码块的局部变量。但请记住,var
仍然可以像往常一样工作。
答案 2 :(得分:-1)
如果您所说的e
在C或C ++等中是code block
,那么javascript就没有这样的,或者有不同的。{/ p>
在javascript中,它被称为{ }
。也许其他语言也有关于它的概念。
Javascript仅在
上生成scope chain
1) function(){}
2) with(){}
3) catch(){}
例如,最着名的例子如下。
scope chain
如果我们点击任何div,则for (var i = 0; i < 5; i++) {
// setClickEventToDiv(i)
}
之间的活动会自setClickEventToDiv(i)
开始5
。
所以,通过
修复它scope chain
因为for (var i = 0; i < 5; i++) {
(function (index) {
//setClickEventToDiv(index)
}(i));
}
拥有自己的function () {}