Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript if块内的函数是否应为typeof==';功能';如果if条件为false?_Javascript_Scope - Fatal编程技术网

Javascript if块内的函数是否应为typeof==';功能';如果if条件为false?

Javascript if块内的函数是否应为typeof==';功能';如果if条件为false?,javascript,scope,Javascript,Scope,考虑以下代码(): 您希望警报显示什么?对我来说,我希望它说“undefined”,因为if块不应该运行,因为shouldDefine=false。在Firefox中,情况就是这样 但在Chrome和IE9中,它说的是“功能”!这是一个浏览器错误还是一个合法的JavaScript行为?通常,这种声明的行为是为当前作用域(即全局作用域或函数调用(在ES5中))声明该函数和任何变量 也就是说:通常,这个函数是独立于测试值定义的:测试是无用的,函数声明被“提升”到封闭函数的开头,就好像测试不存在一样,

考虑以下代码():

您希望警报显示什么?对我来说,我希望它说“undefined”,因为if块不应该运行,因为shouldDefine=false。在Firefox中,情况就是这样


但在Chrome和IE9中,它说的是“功能”!这是一个浏览器错误还是一个合法的JavaScript行为?

通常,这种声明的行为是为当前作用域(即全局作用域或函数调用(在ES5中))声明该函数和任何变量

也就是说:通常,这个函数是独立于测试值定义的:测试是无用的,函数声明被“提升”到封闭函数的开头,就好像测试不存在一样,不管它的结果如何


但是IE的某些版本中存在一个bug,测试用于定义函数,这使得该代码从那时起被视为未定义的行为(该案例的规范一开始就不是很清楚)。以及内部块中的函数声明。

不能在if块中定义函数。正如人们已经说过的,这是实现定义的行为。但是,函数也是对象,因此可以将它们指定给如下变量:

var shouldDefine = false;
var something;

if(shouldDefine) {
    something = function () {
        var a = 1;   
    };
} 

alert(typeof something);

如果
shouldDefine
false
,这将警告
'undefined'
;如果
为true
则警告
'function'

根据ECMAScript规范,块内没有函数声明;任何支持的尝试都是实现定义的行为。(cf.)@apsillers我不清楚我们是否应该以重复的方式关闭。该代码在“严格”模式下是错误的。@虽然所涉及的底层JavaScript机制是相同的,但我认为问题的关注点是完全不同的。(另一个问题问的是风格指南,不明白什么是块,这个问题问的是观察到的行为。)我同意这有点灰色,但我保留我的投票权——我认为与另一个问题的非重复链接可能就够了。
var shouldDefine = false;
var something;

if(shouldDefine) {
    something = function () {
        var a = 1;   
    };
} 

alert(typeof something);