与Java等语言中的块级范围相比,Javascript中功能级范围的优缺点是什么?
我希望看到使用块级范围更难或不可能实现的功能级范围使用的示例。
答案 0 :(得分:5)
首先想到的例子是:如果使用块级范围实现,JavaScript对closures的处理会更加昂贵。
当你在JavaScript中输入一个函数时,会分配一个对象(好吧,一对,但我们会专注于一个),最终成为“变量对象” - 也就是说,所有的参数和本地变量都是该函数调用被保持(作为属性)。闭包实际上使用的是这个对象(不仅仅是它似乎使用的“符号”;这是一种常见的误解)。这些对象串在一起,称为范围链,用于解析不合格的符号。
想象一下,如果每个区块都引入了新的范围,那将会是多么昂贵。
答案 1 :(得分:3)
我希望看到使用块级范围更难或不可能实现的功能级范围使用的示例。
也许听起来很明显,但你可以在函数级范围内实现递归,这通常很有用,例如:
var x = 5; // global scope
(function (y) { // y - locally scoped variable on each execution
y && arguments.callee(--y); // recursion!
console.log(y);
})(x);
使用块级范围几乎不可能实现。
在上面的示例中,函数最初将执行,将外部x
变量的值传递给它,然后在调用函数之前设置新的执行上下文,初始化一个新的词法范围,其中{ {1}}形式参数绑定到它。
之后,再次执行函数表达式 - 如果y
不是y
- 在每次执行时初始化一个全新的词法范围。
答案 2 :(得分:-1)
您无法做任何事情 - 使用块级范围模拟功能级别范围并不难,反之亦然。
条件函数声明会更加尴尬:
if (console && console.log) {
function debug(msg) { console.log(msg); }
} else {
function debug(msg) { alert(msg); }
}
debug('foo'); // does not work with block scope