为什么这个JavaScript代码的结果"未定义"?

时间:2015-02-18 05:46:43

标签: javascript function logging scope output

我试图找出为什么浏览器控制台窗口中此Javascript代码的结果未定义?不应该"外面"?

var text = 'outside';
function logIt(){
    console.log(text);
    var text = 'inside';
};
logIt();

由于

6 个答案:

答案 0 :(得分:4)

这是“可变吊装”的结果。 (见http://adripofjavascript.com/blog/drips/variable-and-function-hoisting。)

要使代码按预期运行,您需要在函数范围内分配变量或将其作为参数传递给函数:

var logIt = function (){
    var text = 'outside';
    console.log(text);
    text = 'inside';
};
logIt();

var text = 'outside';
var logIt = function (txtArg){
    console.log(txtArg);
    var text = 'inside';
};
logIt(text);

答案 1 :(得分:3)

在JavaScript中,变量是"悬挂"到功能的顶部。也就是说,与其他一些语言(例如C)不同,函数内声明的变量在整个函数的范围内。所以编译器会看到你的函数:

function logIt(){
    var text;
    console.log(text);
    text = 'inside';
} // <-- no semicolon after a function declaration

当您在text内声明logIt作为局部变量时,它会在外部范围内隐藏变量。当声明变量时,它被初始化为undefined。这就是未定义打印的原因。

如果您想将text保留在外部范围内,请在函数内部取消var声明。

var text = 'outside';
function logIt(){
    console.log(text); // logs 'outside' now
    text = 'inside';
}
logIt();

答案 2 :(得分:2)

您的console.log(文本)位置错误:)

但严重的是,这是Javascript变量提升。 http://goo.gl/0L8h5D

此:

var text = 'outside'
logIt = function () {
  console.log(text);
  var text = 'inside';
}
logIt();

等同于:

var text                    // hoisted to top of scope; text is undefined
text = 'outside'            // text is now assigned in place
logIt = function () {
  var text;                 // hoisted to top of scope; text is undefined
  console.log(text);        // spits out undefined
  text = 'inside';          // text is now assigned in place.
}
logIt();

为了避免这些问题,养成在范围块顶部声明所有var的习惯。

var text = 'outside'
logIt = function() {
  var text = 'inside'
  console.log(text)
}
logIt()

如果您的意图是吐出'外部',那么您应该在logIt函数中使用不同的标识符名称。

答案 3 :(得分:1)

您正在覆盖变量文本。为了得到你正在寻找的答案,从第4行拿走var。

原因是函数内部有一个来自父作用域或全局作用域的文本变量,你正在更改它,然后在离开函数时将其处理掉。

答案 4 :(得分:0)

声明变量text一次。 Demo

var text = 'outside';
function logIt(){
    console.log(text);
     text = 'inside';
};
logIt();

答案 5 :(得分:0)

全球+本地:一个额外的复杂案例

var x = 5;

(function () {
    console.log(x);
    var x = 10;
    console.log(x); 
})();

这将打印出undefined和10而不是5和10,因为JavaScript始终将变量声明(不是初始化)移动到作用域的顶部,使代码等效于:

var x = 5;

(function () {
    var x;
    console.log(x);
    x = 10;
    console.log(x); 
})();

来自这个答案What is the scope of variables in JavaScript?