首页 > 试题广场 >

执行以下代码,输出的a值为()

[单选题]
执行以下代码,输出的a值为()
if(! "a" in window){
    var a = 1;
}
alert(a);


  • null
  • 1
  • undefined
  • 其他选项均不正确
变量在同一作用域中总是会将声明部分提升至顶部优先进行解析的, 注意这里是只会将声明提升,其余部分仍然在原位置。
发表于 2015-11-22 10:24:14 回复(0)
if(! "a" in window)这句代码的意思是:判断全局对象window中是否有变量a,如果没有变量a,就进入判断将a赋值为1
但是由于变量的提前声明,以上代码与如下代码等价:
var a;
if(!“a” in  window ){
    a=1;
}
alert(a);
由于变量的提前声明特性,在执行这段代码之后,全局对象window中就已经存在a这个变量了
所以不能进入判断,对a进行赋值
所以a的值为undefined
发表于 2018-07-20 18:07:32 回复(23)
if语句里的变量声明提升,但是是没有进行赋值的。
发表于 2022-06-04 09:23:49 回复(0)
in操作符会在通过对象访问到给定属性时返回true,无论该属性是在实例中还是原型中
发表于 2018-10-18 23:07:38 回复(0)
js自身带的预解析
发表于 2017-09-08 17:04:53 回复(0)
对对,还是是变量提升问题!还是javascript只有函数作用域的问题,相当于
var a;
if(! "a" in window){
    a=1;
}
alert(a);
"prop in obj"其中prop是obj的属性名。This's new for me!
发表于 2015-09-25 16:55:18 回复(0)
http://www.css119.com/archives/1678
发表于 2015-08-29 16:07:29 回复(0)
javascript只有函数作用域, 没有块作用域,所以在if 里面的赋值语句 
var a = 1;
分两步
var a ; //这个声明语句会被提升到代码顶部。 
a = 1;
if(! 'a' in window)
//因为! 比 in 的优先级高,所以这个判断式等价 (!'a') in window, 结果为false,
//所以不会执行赋值语句
//alert(a) 返回 undefined

发表于 2016-07-24 09:14:09 回复(16)
C  undefined
发表于 2015-06-10 11:46:04 回复(0)
答案 C
变量提前问题,等价于:
var a;
if(!"a"in window){
    a =1;
}
alert(a);
编辑于 2015-06-14 10:53:17 回复(4)
1.块级作用域
for(var i=0;i<3;i++){
... ...
}
console.log('i='+i);//i=3
JavaScript没有块级作用域。
(function(){
//块级作用域
}))();
模拟块级作用域,避免全局变量污染。
2.var
(1)变量声明
在全局作用域中声明的变量、函数会变成window对象的属性和方法。
使用var声明的全局变量不可删除;
省略var声明的全局变量可删除。
var a = 1;
window.b = 2;
c = 3;
this.d = 4;
var aa = Object.getOwnPropertyDescriptor(window,'a'); //configurable:false,enumerable:true,value:2,writable:true
var bb = Object.getOwnPropertyDescriptor(window,'b'); //configurable:true,enumerable:true,value:2,writable:true
var cc = Object.getOwnPropertyDescriptor(window,'c'); //configurable:true,enumerable:true,value:2,writable:true
var dd = Object.getOwnPropertyDescriptor(window,'d'); //configurable:true,enumerable:true,value:2,writable:true
delete a; // 无法删除
delete b; // 可删除
delete c; // 可删除
delete d; // 可删除
(2)声明提升
console.log(n);//undefined
var n=3;
(3)重复变量声明

使用var语句重复声明语句是合法且无害的,JavaScript会忽略同一变量的后续声明。

3.源码分析
if(! "a" in window){
var a = 1;
}
alert(a);
等价于
var a;
if(!"a"in window){
a =1;
}
alert(a);
(1)JavaScript无块级作用域,在全局作用域中声明变量a为window的属性;
(2)window存在属性a,if语句不成立,a=1赋值语句不执行;
(3)弹出变量a为undefined;
编辑于 2016-08-17 16:32:39 回复(9)
C
此外还有运算符优先级问题,'!'应该是高于'in'的。
alert("a" in window);   //false
alert(! "a" in window); //false
可见(! "a" in window)应该相当于 (!"a") in window 而不是 !("a" in window)。
发表于 2015-10-07 22:26:28 回复(8)
这题还有一个细节 ,在代码的顶部var声明的变量会被认为是window的属性,如果在代码中直接使用a= "foo" ,变量同样会被认为是全局变量但是并不是window的属性。
if(! "a"in window){
    a = 1;
}
alert(a);
这样的话会弹出1
发表于 2015-09-06 20:27:57 回复(6)
使用var声明的变量会被自动添加到最接近的环境的顶部;
变量提升仅提升变量声明,而不是变量赋值。
发表于 2015-08-17 16:18:20 回复(0)
!"a" 会转化成false,然后表达式形同 false in window,就没个人解释!“a”,不详细啊!!!
发表于 2019-04-08 15:37:00 回复(0)
js没有块级作用域,即if,for等语句里声明的变量和其外一层的变量的作用域是一样的(函数作用域,作用域的“局部"是相对于函数而言的)。

             
所以图1中,i,j,的作用域是一样的,图2中输出为2。
变量的声明会在预编译阶段提前到函数体的顶部,但是注意的是变量的赋值并不会提前,所以图2中如果alert(a)放在 if 语句前(这时a已经声明但没赋值),会输出undefined (有没有a=1这一句都一样) ,放在其后会输出2。要注意的是,在if语句中外部的a=1(不带var)编译时会默认当做全局变量,但是如果if语句里的a不用var来声明变量,编译器就不知道这里是声明一个变量。即如图3 浏览器会报错指出a is not defined。
发表于 2016-07-16 17:46:03 回复(1)
if(!"a"in window){
    var a =1;  //此时在JS预编译的时候 生命了  var a 等编译通过后,执行的时候,不会执行赋值表达式
}
alert( a ); 读取到 undifine

发表于 2015-07-08 13:53:52 回复(4)
很简单,本题考察的是变量提升知识点。
a变量提升,a 存在于window对象中,所以a in window为true。
!取反为false。所以不会执行if语句。此时a还是undefined。
发表于 2022-01-27 09:38:50 回复(0)
对于!和 in的优先级比较,结论是!优先级高于in

发表于 2017-03-18 13:35:02 回复(0)
这道题谁出的,太秀了
发表于 2023-03-30 16:29:47 回复(0)