关于一个JS闭包面试题目的疑问

newborn2012 2013-09-26 10:00:47
今天在网上看到一个javascript的面试题,如下:

f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;}
}
})();
alert(f()); // true or false ?

解释答案是:
(function() {
if (g() && [] == ![]) {
//应该看成if((g() && [] )== ![])
//因为g()是false后面那个&&[]就没起作用 整个都是false
//![]也是false 所以if成立 进入if块内
f = function f() {return false;};
//重新定义f
function g() {return true;}
//这句没用
}
})();
alert(f());
//false
源文档位于http://t240178168.iteye.com/blog/1633344
===================================================
最终答案确实是false,但是我拿这段代码调试了一下,却发现解释不怎么对,if语句中的g()返回不是false,而是true,if语句里面定义的函数g()这句不是没用,而是确实被调用了,这是为什么呢,求高手解释。


[cj205]楼下的答案是何等的扯淡,在此我必须要纠正下其中的错误,未免对查到此贴的人产生影响。
首先==的优先级是高于&&的 那么楼下的那个表达式分解就是扯淡的很。
其次,本题中的几个问题分别涉及到如下3个知识点
1.数组也是对象
2.function A()属于函数声明,会在javascript具体执行前作过一轮扫描。
3.非相同类型的值进行等值比较时,是要做类型转换的。
...全文
666 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiwawa_jimm 2016-03-29
  • 打赏
  • 举报
回复
if中的g(),提示不是函数,alert(g());返回function(){returne false}
小V 2015-04-06
  • 打赏
  • 举报
回复
ES5下的bug啊,if 里面会有函数提升,不管if是true还是false ES6下不再有函数提升问题
zhjdg 2014-02-18
  • 打赏
  • 举报
回复
这分明是扯蛋的东西,关闭包毛事。 var $a = []==[];
小巷斜阳 2014-02-18
  • 打赏
  • 举报
回复
返回true,调试结果是没有进入if
newborn2012 2013-09-27
  • 打赏
  • 举报
回复
奇怪,管理员为什么要删我回复的帖子呢?
  • 打赏
  • 举报
回复
if (g() && [] == ![]) 感觉这一句只执行到g(),后面的函数定义function g() {...没能把var g = function() {...覆盖,即使把function g() {...隐藏,结果相同
  • 打赏
  • 举报
回复
f = function() {return true;};   
g = function() {return false;};   
(function() {   
   if (g() && [] == ![]) {   
	alert('hi');
      f = function f() {return false;};   
      //function g() {return true;}   
      var g = function() {
		return true;
	};
   }   
})();   
alert(f()); 
如果改成这样就出错,说明函数定义方式是先加载的
xiaozhiqiang15 2013-09-26
  • 打赏
  • 举报
回复
引用 6 楼 veryhunger 的回复:
实际没进入if
有没有进“if”,你用浏览器调试看看就知道了。
  • 打赏
  • 举报
回复
实际没进入if
  • 打赏
  • 举报
回复
引用 4 楼 xiaozhiqiang15 的回复:
这一道题考核点有几个; 第一:运算符的优先级(笔试题考运算符优先级真的很无聊诶!)。 第二:函数的置顶; 第三:运算符“&&”另类使用; 第四:“==”的鸡肋; 1.因为运算符优先级,所以"if"里先判断(g() && []): 2.“g()”的值: 即使函数定义代码在最后,因为代码解析是 先将"var"还有"function"的先读取(有一个叫“变量对象”的解释起来很麻烦),理解就是以下代码

(function() {   
   if (g() && [] == ![]) {   
      f = function f() {return false;};   
      function g() {return true;}   
   }   
})();  
真正执行时相当于

(function() {
   function g() {return true;}      
   if (g() && [] == ![]) {   
      f = function f() {return false;};   
   }   
})();  
所以if里面的"g()"相当于true; 3.而(true && [])的结果是[],对!你没看错不是false或true而是空数组“[]”(参见javascript“&&” “||”另类使用技巧); 4.然后([] == ![])的值部分,没使用“==”对比是会自动类型转换的,所以“[]”被转换成“false”了, ([] == ![])就返回true啦! 如果使用“===”就绝壁不会这样啦!(话有说回来实际开发中谁会那么操蛋拿[]去和![]比较?) 5.if(true)后就是“ f = function f() {return false;}; ”就这样全局变量f在这个被称作“匿名包裹函数”的函数中被改变啦。
照你分析的答案是false,实际是true
xiaozhiqiang15 2013-09-26
  • 打赏
  • 举报
回复
这一道题考核点有几个; 第一:运算符的优先级(笔试题考运算符优先级真的很无聊诶!)。 第二:函数的置顶; 第三:运算符“&&”另类使用; 第四:“==”的鸡肋; 1.因为运算符优先级,所以"if"里先判断(g() && []): 2.“g()”的值: 即使函数定义代码在最后,因为代码解析是 先将"var"还有"function"的先读取(有一个叫“变量对象”的解释起来很麻烦),理解就是以下代码

(function() {   
   if (g() && [] == ![]) {   
      f = function f() {return false;};   
      function g() {return true;}   
   }   
})();  
真正执行时相当于

(function() {
   function g() {return true;}      
   if (g() && [] == ![]) {   
      f = function f() {return false;};   
   }   
})();  
所以if里面的"g()"相当于true; 3.而(true && [])的结果是[],对!你没看错不是false或true而是空数组“[]”(参见javascript“&&” “||”另类使用技巧); 4.然后([] == ![])的值部分,没使用“==”对比是会自动类型转换的,所以“[]”被转换成“false”了, ([] == ![])就返回true啦! 如果使用“===”就绝壁不会这样啦!(话有说回来实际开发中谁会那么操蛋拿[]去和![]比较?) 5.if(true)后就是“ f = function f() {return false;}; ”就这样全局变量f在这个被称作“匿名包裹函数”的函数中被改变啦。
fzfei2 2013-09-26
  • 打赏
  • 举报
回复
是的他的解释答案 有问题 (function() { if (g() && [] == ![]) { f = function f() {return false;}; function g() {return true;} //函数声明,是预先解析 } })(); //g() 是以函数内声明的那个,return true (g() && []) 得 [] 并不是 true , ![] 得 false []==false 得 true, .....
  • 打赏
  • 举报
回复
是true 很简单啊

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧