首页 > 试题广场 >

有如下代码:

[单选题]
有如下代码:
var name="World!";
(function(){
    var name;
    if(typeof name=== 'undefined'){
        name='Jack';
        console.log('Goodbye'+name);
    }
    else{
        console.log('hello'+name);
    }
})();

请问执行后弹出的值是
  • Hello World!
  • Goodbye Jack
  • Hello Jack
  • Goodbye World!
B, 变量生明会提升到当前作用域的顶部,一个函数就是一个作用域, ;!function(){ //var f;实际上解释器这么做 console.log(f);//undefined var f=2333;// 然后f=anyValue; }();
发表于 2016-12-08 19:01:09 回复(0)
函数“自动”执行时,外层的name还没有被赋值
发表于 2017-03-05 15:10:19 回复(1)
变量提升个鸡儿,别听他们胡扯,js搜索变量是从内部顺原型链往外部找的,内部直接找到了name,就不去外部了,执行第一次if时还没初始化值,所以为undefined,然后赋值,执行console,结束,
发表于 2017-10-12 01:53:18 回复(19)
当函数内部变量与全局变量同名时 全局变量会被覆盖 因为js是单线程执行 var name当前没有赋值 所以类型为undefined
发表于 2017-09-02 09:41:49 回复(7)

变量声明提升

JS码分为解析阶段和执行阶段。
在解析阶段会找到所有声明,并会与各自执行环境关联。只有声明操作会被提升,赋值和逻辑操作会被留在原地等待代码执行。
如对于 var a=2;  解析器会把它当成声明操作(var a)和赋值操作(a=2)两部分。声明操作会被提升到它所在执行环境的顶部,并赋值 undefined而赋值操作则会原地待命。 原代码相当于:
var name="world";
(function(){
var name;         //JS无块级作用域,所以变量声明提升到此处
if(typeof name==="undefined"){                                     //进入if控制语句
name="Jack";
console.log("Goodbye"+name);                                     //执行该语句
}else{
console.log("Hello"+name);
}
})();
//所以答案为 Goodbye Jack
编辑于 2017-08-22 14:36:25 回复(11)

(function(){
        var name;//注意这里,变量提升
	if(typeof name === 'undefined'){
		name = 'Jack';
		console.log('Goodbye'+name);
	}else{
		console.log('hello'+name);
	}
})();

发表于 2016-12-27 21:42:28 回复(9)
函数会首先搜索函数内部的变量,因为var变量名提升,所以它能找到name,但此时代码还没有运行到赋值那一步,所以name是undefined。因此结果是goodbye jack
发表于 2017-05-29 18:35:05 回复(0)
打断点调试 就明白了 ;
自执行的函数的this指的是window,就会在全局里面找这个属性的值;
 但是如果后面有定义也就是var name="jack" 那么指的就是下面的元素,所以第一个的name是一个先使用后定义的 所以是undefined;
发表于 2016-12-24 00:28:20 回复(0)
		var name="World!";
		(function() {
			console.log(name)   //world
			console.log(typeof name==="undefined")   //flase
			if(typeof name==="undefined") {
				// var name="Jack";
				console.log("Goodbye"+name);
			} else {
				console.log("Hello"+name);  //hello world
			}
		})();

		var name="World!";
		(function() {
			console.log(name)   //undefined
			console.log(typeof name==="undefined")   //true
			if(typeof name==="undefined") {
				var name="Jack";
				console.log("Goodbye"+name);  //Goodbye Jack
			} else {
				console.log("Hello"+name);  
			}
		})();

发表于 2017-04-17 22:08:39 回复(2)
(function(){
  //这里是块级作用域
})();
块级函数内的name和全部变量name不是同一个name
发表于 2018-04-13 10:18:54 回复(4)
这个问题跟变量上升没关系的吧~我觉得这个问题要注意三个点。第一,if条件里使用的是在function内声明且没有赋值的变量name~第二,typeof的返回值是String类型的(如图)~第三,=== 为true的条件是值和类型都要相等。 题目里 if(typeof name=== 'undefined') 等号两边的值都是'undefined' 类型也都是String类型 所以是true.
编辑于 2018-08-18 17:21:53 回复(2)
搞不懂你们为什么都说变量提升,这跟变量提升有个鸡毛关系?这明明考的局部作用域。
发表于 2017-12-18 23:05:28 回复(0)

函数访问变量的时候,会先从自己的作用域内(也就是函数内部)去找有没有这个变量如果没有的话才会去全局里找

var name="World!";
(function(){
    var name;
    if(typeof name=== 'undefined'){
        name='Jack';
        console.log('Goodbye'+name);
    }
    else{
        console.log('hello'+name);
    }
})();
 
//  立即执行函数没有函数提升,代码执行过程如下:
 
var name; //立即执行函数没有函数提升,所以最前面是全局变量name的变量提升。
name="World!";
(function(){ //函数访问变量的时候会先从自己的作用域里找,找不到了才会去全局找。
    var name; //函数自己的作用域里定义了name,只不过是没有赋值
    if(typeof name=== 'undefined'){ //故进入这个条件
        name='Jack';
        console.log('Goodbye'+name);
    }
    else{
        console.log('hello'+name);
    }
})();

//以下例子说明函数访问变量会先去自己的作用域里找,因为找到了所以就不用去全局找了。



发表于 2022-01-07 16:25:35 回复(1)
<p>这道题根本不存在变量提升问题,这题考的是变量赋值和typeof,函数内name未定义初始化undefined,typeof name === ‘undefined’ 为true,执行if语句,name重新赋值后打印,仅此而已。变量查找问题,是在当前作用域找,如果没找到才会到上一级作用域找,严格来讲不能说变量重名会覆盖问题。</p>
发表于 2020-07-12 11:27:36 回复(0)
局部覆盖全局,name未定义,所以输出Goodbye Jack
发表于 2018-04-21 18:28:00 回复(0)
  • 在立即执行函数中,有局部作用域,此时声明了局部变量 name,在此作用域中,局部变量 name 覆盖了全局变量 name
  • 局部变量 name 声明时未赋初值,值为 undefined,执行 name='Jack' 后,值变为 Jack,随后打印输出
发表于 2022-08-07 09:55:03 回复(0)
undefined有冒号?那就没答案了吧...

编辑于 2022-04-11 16:45:20 回复(0)
变量提升个鸡儿,一本正经***.

发表于 2020-11-26 10:35:44 回复(0)
var name="World!";
(function(){
var name; //undefined;
console.log(name==="undefined")//false
console.log(typeof name==="undefined")//ture
//这里是隐形转换
//只有 null "" 0 -0 null undefined false 才是false
//而此处的 typeof false 是Boolean类型 所以 隐形转换是ture
//这里才是这道题真正的考点 无论 
if(typeof name=== 'undefined'){
name='Jack'; //进入if
console.log('Goodbye'+name);
}
else
{
console.log('hello'+name);
}
})()
发表于 2019-02-21 21:10:06 回复(0)
(function() { ... })();是块级作用域,独立于外部执行环境。
发表于 2018-03-18 20:36:27 回复(0)