2011-08-06 119 views
32

在“if”语句中声明和分配的变量是否仅在该“if”块内或在整个函数内可见?IF语句中的javascript变量范围

我是否在下面的代码中执行此操作? (似乎工作,但多次声明“var结构”似乎很尴尬)任何更清洁的解决方案?

function actionPane(state) { 
    if(state === "ed") { 
     var structure = { 
      "element" : "div", 
      "attr" : { 
       "class" : "actionPane" 
      }, 
      "contains" : [{ 
       "element" : "a", 
       "attr" : { 
        "title" : "edit", 
        "href" : "#", 
        "class" : "edit" 
       }, 
       "contains" : "" 
      }, { 
       "element" : "a", 
       "attr" : { 
        "title" : "delete", 
        "href" : "#", 
        "class" : "delete" 
       }, 
       "contains" : "" 
      }] 
     } 
    } else { 
     var structure = { 
      "element" : "div", 
      "attr" : { 
       "class" : "actionPane" 
      }, 
      "contains" : [{ 
       "element" : "a", 
       "attr" : { 
        "title" : "save", 
        "href" : "#", 
        "class" : "save" 
       }, 
       "contains" : "" 
      }, { 
       "element" : "a", 
       "attr" : { 
        "title" : "cancel", 
        "href" : "#", 
        "class" : "cancel" 
       }, 
       "contains" : "" 
      }] 
     } 
    } 
    return structure; 
} 
+0

请注意,您也可以这样做:'if(state ===“ed “){return {...}} else {return {...}}'而不是使用变量。 –

回答

35

1)Variables are visible for the whole function scope。因此,你只应该申报一次。

2)你不应该在你的例子中声明变量两次。我建议在函数的顶部声明变量,然后后来才设定值:

function actionPane(state) { 
    var structure; 
    if(state === "ed") { 
     structure = {  
      ... 

有关JavaScript的极好的反馈,我强烈建议由Douglas Crockford的使用JSLint。它会扫描您的代码以查找常见错误,并找到清理建议。

我也推荐阅读小本书JavaScript:好部件。它包含了很多编写可维护的JS代码的技巧。

+0

@WebWanderer - 仅适用于ES6,这非常棒,但需要使用客户端的编译器。 ES5和更旧的版本不支持全局或功能级范围以外的任何其他功能。 – OverZealous

+0

我想现在几乎每个人都使用JSHint而不是JSLint。 –

+0

@KevinWheeler这是一个相当古老的答案,但是从事ES6或更高版本工作的人会更好地迁移到[ESLint](http://eslint.org/)。 – OverZealous

31

JavaScript有没有“块范围”,它只有功能范围 - 所以内部的声明的变量if语句(或任何条件块)被“悬挂”在外部范围。

if(true) { 
    var foo = "bar"; 
} 
alert(foo); // "bar" 

这实际上描绘了一幅清晰的画面(和在接受采访时谈到了,从经验:)

var foo = "test"; 
if(true) { 
    alert(foo); // Interviewer: "What does this alert?" Answer: "test" 
    var foo = "bar"; 
} 
alert(foo); // "bar" Interviewer: Why is that? Answer: Because JavaScript does not have block scope 

功能范围,在JavaScript中,通常是指关闭。

var bar = "heheheh"; 
var blah = (function() { 
    var foo = "hello"; 
    alert(bar); // "heheheh" 
    alert(foo); // "hello" (obviously) 
}); 

blah(); // "heheheh", "hello" 
alert(foo); // undefined, no alert 

该函数的内部范围可以访问它所在的环境,但不能以其他方式访问。

要回答第二个问题,可以通过最初构建满足所有条件的“最小”对象,然后根据已满足的特定条件对其进行扩充或修改来实现优化。

+6

Javascript确实有块范围。你可以使用'let myVar ='在'if语句'中声明变量!“[查看'let'关键字](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let) – WebWanderer

+0

@WebWanderer让我们很难在2015年12月在这里得到支持,这个答案发布在2011年8月。 – trex005

+0

@ trex005是的,我明白了。从技术上讲,它还没有得到支持,但将与ECMA 6。我的评论是不是为OP,谁没有找到他们的答案在四年多,而是其他人通过这个帖子想知道如何做到这一点现在。以我的意见作为一厢情愿的想法。 – WebWanderer

2

if语句中声明的变量只要驻留在同一个函数中就可以使用outisde。

在你的情况,最好的方法是申报结构,然后修改对象的,在任何一种情况下,不同的部分:

var structure = { 
    "element" : "div", 
    "attr" : { 
     "class" : "actionPane" 
    }, 
    "contains" : [{ 
     "element" : "a", 
     "attr" : { 
      "title" : "edit", 
      "href" : "#", 
      "class" : "edit" 
     }, 
     "contains" : "" 
    }, { 
     "element" : "a", 
     "attr" : { 
      "title" : "delete", 
      "href" : "#", 
      "class" : "delete" 
     }, 
     "contains" : "" 
    }] 
} 

if(state != "ed") { 
    // modify appropriate attrs of structure (e.g. set title and class to cancel) 
} 
2

是和宣布,以“如果”声明分配变量在“if”块内还是在整个功能范围内仅可见 ?

在Javascript中,所有的变量要么

  • 全球范围
  • 本地范围(整个功能) - JavaScript没有一个“块范围”,其中变量只能凭本地范围的小块(功能)

我是否在下面的代码中执行此操作? (似乎工作,但 多次宣布“var结构”似乎是尴尬的)任何清洁器 解决方案?

是的。更清洁的解决方案可能是构建基类structure,并修改每种情况下的不同。

+0

Javascript没有课程。 –

+1

@Tomalak:Javascript * does *,但是,有对象,它们可以类比。 – foxy

+0

Javascript有对象。但是它的OOP模型是基于原型的,而不是基于类的。 –

3

ECMAScript的2015年(ES6)包括两个新的关键字,终于允许JavaScript实现适当的块作用域,而无需使用变通方法,口语语法:

  1. let
  2. const