两个令人困惑的Javascript测验

时间:2016-04-20 00:13:16

标签: javascript

只是觉得对一些测验感到困惑。

测验一次



var x = 1;
  if (function f(){}) {
    x += typeof f;
  }
  alert(x);




答案:

x的答案是" 1未定义"

混乱:

真正发生了什么"功能f(){}"如果条件?

测验二



(function(x){
    delete x;
    return x;
  })(1);




答案:

输出为1.

混乱:

为什么删除不起作用? 什么时候删除'工作和什么时候没有?

3 个答案:

答案 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。

如前面的答案所述。删除删除对象属性,它不会清除或销毁变量。