首页 > 试题广场 >

(function() { var x=foo();

[单选题]

(function() {
    var x=foo();
    var foo=function foo() {
        return "foobar"
    };
    return x;
})();
上面这段代码运行后的输出是

  • foo()
  • 类型错误
  • undefined
  • foobar
推荐
var foo=function foo() {
return “foobar”
};
foo变量“被提前”了,但是他的赋值(也就是函数)并没有被提前,从这一点上来说,和前面我们所讲的变量“被提前”是完全一致的,并且,由于“被提前”的变量的默认值是 undefined。
函数声明可以被提前,但函数表达式不能被提前
编辑于 2017-03-19 12:09:30 回复(8)
var x = foo();
var foo=function foo() {...}

语句中变量的声明会提升,但是定义不会提升。以上代码等同于:

var foo;
var x = foo();
foo = function foo() {...}

当执行到 x = foo() 时,由于foo未被定义为函数,所以会返回

TypeError: foo is not a function
发表于 2017-08-09 09:11:11 回复(8)

所以是要告诉我们:函数要先定义后使用?

编辑于 2020-12-15 16:24:10 回复(0)
函数变量的声明不会提前被解析,函数可以,如果声明的是函数,(function foo(){...}),则返回的是undefined
发表于 2017-12-21 15:14:17 回复(0)
声明可提升赋值不可以
发表于 2017-12-01 17:58:08 回复(0)
函数表达式不会提升。

发表于 2017-03-06 22:28:51 回复(0)
为什么牛客做题总是保存不了答案,选了之后点下一题不保存,最后答案都是空。

发表于 2017-02-12 13:30:38 回复(0)
b
发表于 2016-12-12 11:14:34 回复(0)
Eos头像 Eos
函数执行顺序: ①var x; //变量声明提前 ②var foo; //变量声明提前 ③x=foo(); //给x赋值,会报错,因为foo变量目前是undefined,不是函数类型 ④foo=function foo() {return "foobar";}; //给foo赋值 foo变量“被提前”了,但是他的赋值(也就是函数)并没有被提前,从这一点上来说,和前面我们所讲的变量“被提前”是完全一致的,并且,由于“被提前”的变量的默认值是 undefined。 函数声明可以被提前,但函数表达式不能被提前
发表于 2018-07-21 14:38:59 回复(0)
在编辑器中运行后“TypeError”,答案B
原因:es5语法中var定义的变量是可以提升的,x在foo前面定义,此时foo是undefined,运行到x=foo();当然会报错,如果把x定义放在foo的后面,就不会报错。
发表于 2016-12-23 16:36:44 回复(0)
关键点在于var x=foo()这里的括号,如果是x=foo,那么返回值是undefined;但是undefined不能作为函数被调用,所以会报错TypeError。
发表于 2017-12-15 15:21:18 回复(0)
同意 难的 举个手
发表于 2018-04-22 11:14:14 回复(1)
变量提升,但是函数表达式不会提升。
x在foo之前定义,此时foo是undefined。运行到x = foo();时,当然会报错。
如果把x定义放在foo的后面,就不会报错。
发表于 2017-03-13 14:19:35 回复(0)




发表于 2020-07-29 14:34:14 回复(0)
函数声明可以被提前,但是函数表达式不能被提前
发表于 2017-03-19 10:33:13 回复(0)
// 原先码相当于下面这段
(function () {
  // 预编译阶段造成了变量提升
  var x
  var foo

  x = foo() // 相当于执行 x = undefined(),会抛出异常提示 foo 并不是函数

  // 抛出异常后后面代码都没有执行
  foo = function foo() {
    return 'foobar'
  }
  return x
})()

发表于 2022-04-20 12:08:17 回复(1)
//代码执行过程如下:
(function() {
    var x;      //变量提升
    var foo;    //变量提升
    x = foo();  //此时foo只是一个变量,不是函数,调用会报错
    foo = function foo(){ return 'foober'}
    return x;
})();

发表于 2022-01-05 14:32:47 回复(0)
把这个弄懂吧
(function () {
    var x = foo();
    var foo = function foo() {
        return "foobar"
    };
    return x;
})();
//上面的等价于下面的
(function () {
    var x;
    var foo;
    x = foo();
    foo = function foo() {
        return "foobar"
    };
    return x;
})();
--------------------------------------------
(function () {
    var x = foo();
    function foo() {
        return "foobar"
    };
    return x;
})();
//上面的等价于下面的
(function () {
    function foo() {
        return "foobar"
    };
    var x;
    x = foo();
    return x;
})();




发表于 2022-03-06 21:45:32 回复(0)
再次强调,变量提升!!!
发表于 2017-03-02 16:13:07 回复(2)
函数变量定义声明可提前,函数表达式定义的不可提前·
发表于 2022-03-10 16:25:04 回复(0)