我正在尝试在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);
答案 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;
,最好在函数之上。然后,您可以使用setFoo
在foo = val;
内进行设置。 foo
然后引用您在setFoo
以上级别声明的那个。
foo
可以setFoo
和alert
这种方式访问;将其与上面的示例代码进行比较(function1
为setFoo
,a
为foo
,alert
调用位于最高级别。{{1在您的情况下不使用{},function2
和b
。)。
答案 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中,新范围仅由函数
创建