请考虑以下代码:
var factory = function(someCondition) {
var para1 = 'some value';
if(someCondition)
var para2 = 'some other value';
return new MyClass(para1, para2);
}
我知道此代码为perfectly legal,即使在para2
内声明了if
但在外面使用过。
我的问题是:这是否 - 虽然合法 - 被主要的Javascript风格指南视为不好的风格?如果是这样,提议的替代方案是什么?
请注意:我知道提升以及变量不是块范围而是功能范围的事实。
答案 0 :(得分:5)
从技术上讲,变量是"悬挂" ,代码将按如下方式执行:
var para1 = 'some value';
var para2;
if(someCondition)
para2 = 'some other value';
范围内的所有var
声明在执行代码之前声明此范围内的变量。因此,它在实践中并没有太大的不同。但是,我认为如上所述明确编写代码是很好的方式,以明确范围内存在哪些变量。 "隐藏"条件内的变量声明会导致混淆。
答案 1 :(得分:3)
这不应该是一种糟糕的风格,这可能有点令人困惑。
任何方式javascript都会因为吊装而像贝娄那样,所以写得更好也像贝娄一样。
var factory = function(someCondition) {
var para1 = 'some value';
var para2; //declare it here
if(someCondition)
para2 = 'some other value'; //assign the value here
return new MyClass(para1, para2);
}
ES6版本引入了一个新关键字让,它提供了变量阻止作用域。
答案 2 :(得分:2)
JavaScript'吊装'的一个例子:
var para2 = "my value";
var factory = function(someCondition) {
var para1 = 'some value';
console.log(para2);
if(someCondition)
var para2 = 'some other value';
return new MyClass(para1, para2);
}
factory(true); // undefined
以上代码将记录'undefined'。
答案 3 :(得分:1)
JavaScript使用函数范围,因此我会像这样写
var factory = function(someCondition) {
var para1 = 'some value';
var para2 = 'some other value';
if(someCondition)
{
// some code..
}
return new MyClass(para1, para2);
}
答案 4 :(得分:0)
我会说没事。
var factory = function(someCondition) {
var para1 = 'some value';
if(someCondition){
var para2 = 'some other value';
alert(para2);
}
alert(para2);
return new MyClass(para1, para2);
}
我已添加警报,以便您可以专注于。这里。在if语句中,您声明一个名为para2的变量。运行此代码时,它下方的警报功能会显示“其他一些值”!那讲得通。可能不太有意义的是,if语句之外的第二个警报也会显示“其他一些值”!。
以下是正在发生的事情。如果称为块,则在para2变量内部声明。块是打开和关闭括号内的任何内容 - {和}。在许多编程语言中,块内声明的变量是该块自身范围的一部分。这意味着这些变量是本地的,不能在块之外访问。
JavaScript与许多“其他”编程语言不同。 JavaScript不支持块范围。
查看更多here