只是觉得对一些测验感到困惑。
测验一次
var x = 1;
if (function f(){}) {
x += typeof f;
}
alert(x);

答案:
x的答案是" 1未定义"
混乱:
真正发生了什么"功能f(){}"如果条件?
测验二
(function(x){
delete x;
return x;
})(1);

答案:
输出为1.
混乱:
为什么删除不起作用? 什么时候删除'工作和什么时候没有?
答案 0 :(得分:5)
由于任何函数都是真的,您只需使用字符串1
加入数字'undefined'
。在第二个中,delete
仅适用于对象属性。
答案 1 :(得分:3)
#1 上的混淆点是函数作为函数表达式。该函数是真实的(因此它将if语句作为truthy传递)但它不是函数语句,因此不会为它创建外部f
引用。
与将函数分配给变量时的概念相同:您正在创建函数表达式。
var g = function(){};
命名函数表达式并没有实际改变:
var g = function f(){};
// it would still only be externally accessible as g, not f
只能从函数内部f
访问它:
var g = function f(){ alert(f); };
g(); // will call the function, and from inside f will work
要使f
作为函数语句(而不是表达式),必须在其当前范围内自行定义,如下所示:
function f() {}
// now we can reference it as f externally as a statement!
即使只是一个角色而且它也变成了一个表达式......
!function f() {}
// now we can't :(
对于#2 ,很简单:删除是针对对象属性的。如:
var obj = {};
obj.foo = 'bar';
delete obj.foo;
alert(obj.hasOwnProperty('foo')); // <- false
答案 2 :(得分:0)
f不等于f(),你在未定义的变量上使用typeof,它返回字符串undefined,你追加到x。
如前面的答案所述。删除删除对象属性,它不会清除或销毁变量。