2016-04-20 10 views
0

ちょうどいくつかのクイズについて混乱を感じる。2つの混乱するJavascriptのクイズ

クイズ一つ

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

回答: xの答えは "1undefined" さ

混乱:

実際にif条件で "function f(){}"に何が起こったのですか?

クイズつ

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

回答:

出力される1

混乱:

なぜ削除が機能しないのですか? 「削除」はいつ行われますか?

答えて

3

#1の混乱の点は、関数式として関数が作られているということです。この関数は実数です(真理としてif文を渡します)が、関数文ではないので、そのために外部の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! 

の方法でも、ただ一つの文字と、それは代わりに、表現になり...#2については

!function f() {} 
// now we can't :(

、非常に単純:削除は、オブジェクトのプロパティのためです。このような:

var obj = {}; 
obj.foo = 'bar'; 
delete obj.foo; 
alert(obj.hasOwnProperty('foo')); // <- false 
+0

ありがとうこれらの有用な情報のためにたくさん! – Kelvin

5

いずれの関数も真であるため、数字1と文字列'undefined'を結合しました。そして2番目のケースでは、deleteはobject-propertiesでしか動作しません。

+0

関数ブール値の説明とキーワードを削除していただきありがとうございます – Kelvin

0

fはf()と同じではありません。未定義の変数にtypeofを使用しています。これは、xに追加する文字列undefinedを返します。

前の回答が記載されているように。削除はオブジェクトのプロパティを削除しますが、変数をクリアまたは破棄しません。