试图找出范围的工作原理

时间:2011-12-14 12:28:23

标签: javascript variables scope

我正在尝试在codeacademy上学习JS,我无法理解/过去这件事。有人可以提供答案,并解释为什么会这样?会深深体会到。

// This function tries to set foo to be the
// value specified.

function setFoo(val) {
  // foo is declared in a function. It is not
  // accessible outside of the function.
  var foo = val;
}

setFoo(10);

// Now that we are outside the function, foo is
// not defined and the program will crash! Fix this
// by moving the declaration of foo outside of the
// function. Make sure that setFoo will still update
// the value of foo.
alert(foo);

8 个答案:

答案 0 :(得分:3)

您可以将范围视为术语,表示您可以在代码中的特定“级别”获得哪些变量。在JavaScript中,这些“级别”由函数定义。每个功能都引入了一个新的水平。

例如,请参考以下示例代码:

var a;
// you can access a at this level

function function1() {
  var b;
  // you can access a, b at this level

  function function2() {
    var c;
    // you can access a, b, c at this level
  }
}

因此,在您的情况下,您应该在函数外部声明var foo;,最好在函数之上。然后,您可以使用setFoofoo = val;内进行设置。 foo然后引用您在setFoo以上级别声明的那个。

foo可以setFooalert这种方式访问​​;将其与上面的示例代码进行比较(function1setFooafooalert调用位于最高级别。{{1在您的情况下不使用{},function2b。)。

答案 1 :(得分:2)

// Create globale variable
// (You should not use globale variables!)
var foo;

// set value
function setFoo(val) {
  foo = val;
}
setFoo(10);

// show value
alert(foo);

答案 2 :(得分:2)

只需在任何函数之外声明foo,然后它就是全局的:

var foo = null;

function setFoo(val) {
  foo = val;
}

setFoo(10);

alert(foo);

试试吧!

答案 3 :(得分:2)

当您在Javascript中声明一个变量时,它只对与声明的函数相同的函数或该函数的函数inernal可见。因为foo最初是在SetFoo函数中声明的,所以SetFoo之外没有任何东西可以看到它,因此对于警报的调用失败,因为在gloabl范围内不存在foo。

正如评论所暗示的那样,将foo的声明移出函数并进入全局作用域(你可以将其视为包含所有内容的全能函数)将允许你在调用alert时使用foo。

var foo;
function setFoo(val) {   
  foo = val; 
}
setFoo(10); 
alert(foo); // No longer crashes

答案 4 :(得分:2)

Javascript中的每个函数都有自己的范围。这意味着您使用var关键字定义的每个变量都只能在该函数中使用。这意味着当你调用setFoo(10)时,你创建了变量foo,给它一个值为5,之后它立即被销毁,因为它超出了范围。

有多种方法可以解决这个问题。第一个是删除var关键字。这将把foo放在全球范围内,这意味着它可以在任何地方使用。但是,这是不鼓励的,您希望保持全局范围尽可能整洁,以便如果您在同一页面上有多个人提供的JavaScript代码,则它们不能覆盖其他人的变量。另一种方法是:

function setFoo(val){
    var foo = val;
    alertfoo = function(){
        alert(foo)
    } 
}

在这个例子中,你唯一放在全局范围内的是alertfoo函数,因为你希望它在任何地方都可用。 alertfoo函数是在setFoo函数中定义的,这意味着虽然在执行setfoo之后foo应该已超出范围,但它会保留在内存中,因为alertfoo可以访问它。

这是一些不错的技巧。例如,假设您正在创建一个将包含在其他人页面上的JavaScript库,您将需要创建一个范围,您可以在其中定义变量,而不会污染全局范围。最常见的方法是声明自动执行功能。这是一个在定义后立即执行的函数,它看起来像这样:

(function(){
    //set variables you want to be global in your own code
    var mainpage = document.getElementById('main');

   //define functions you want to make available to other people in a way that puts them in the global scope
   setMainElement = function(newmain){mainpage = newmain;}
})();

通过只使一个对象成为全局对象,你可以通过该对象的方法提供你的interfae,这样就可以创建一个包含库所包含的所有函数的命名空间。下一个示例使用对象文字来执行此操作。在javascript中,您可以通过在花括号之间放置键/值对来创建对象。键/值对是对象的属性。例如:

(function(){
    var privatevar = 10,otherprivate=20;

     publicInterface = {
        'addToPrivate': function(x){privatevar+=x;},
        'getPrivate': function(){return private}
     };
})();

答案 5 :(得分:1)

原始代码:

function setFoo(val) {
  var foo = val;
}

setFoo(10);

alert(foo); // Crash!

他们建议修复崩溃:

  

通过将foo的声明移到函数

之外来解决此问题

我猜你对“功能之外”的含义感到困惑。

试试这个经过编辑的代码:

var foo = 5; // "var" declares the variable to be in this outer scope

function setFoo(val) {
  foo = val; // but we can still access it in this inner scope...
}

setFoo(10);

alert(foo); // Displays a dialog box that says "10"

答案 6 :(得分:0)

函数中定义的变量仅在函数

中有效
function setFoo(val) {
    foo = val;
}

答案 7 :(得分:0)

在JavaScript中,新范围仅由函数

创建