2016-07-14 3 views
-1

Function.prototype.call() & Function.prototype.apply()の値がnullまたはundefinedの場合、.call()および.apply()のこの値が `null`または` undefined`の場合はどうなりますか?

以下のコードの例を取る:MDN Function.prototype.apply()から

var numbers = [5, 6, 2, 3, 7]; 
var min = Math.min.apply(null, numbers); 

例。

編集: 元の質問は、第三の部分と異なる例を有する:

.applyは.call()&のthis値は()null又はundefinedあるいはなしことができますか?

Array.prototype.slice.call(auguements)の例を取ります。

ノーこの値が存在していると思ったが、@ guest271314のおかげで、今私はそれが唯一のstrictモードでnullまたはundefinedすることができ

+0

'arguments'は' '.slice()' – guest271314

+0

ああ、私が見る、それは愚かだったためthis'。@ guest271314 –

+0

なぜあなたが質問から例を削除したのですか? – guest271314

答えて

1

愚かだった知っています。

スローピーモードでは無視され、代わりにグローバルオブジェクトが取得されます。

function logThis() { 
 
    console.log(this === window); // true :(
 
} 
 
logThis.call(undefined); 
 
logThis.call(null); 
 
logThis.apply(undefined); 
 
logThis.apply(null);

これは、thisModeが厳密である場合

    1. thisValueことせ[[Call]]

      によって使用される、OrdinaryCallBindThisで定義されていますthisArgumentthisArgumentが、その後 ヌルまたは 未定義、あるそうで
      1. 場合
        1. thisValuecalleeRealmとする。[[globalThis]]。エルス
        2. thisValueは(thisArgumentToObjectとします。

    あなたがnullまたはundefinedthis値を持つ関数を呼び出すと、それを破るかどうかを知りたい場合は、その関数がthis値をどうしようとかを知る必要があります。

    例では、Math.minは、thisの値を完全に無視するため、渡す値は関係ありません。ただし、Mathメソッドなので、nullまたはundefinedの代わりにMathを渡すのが理にかなっている可能性があります。

    Math.min.apply(Math, [5, 6, 2, 3, 7]); // 2 
    
  • +1

    すぐに答えを探すのではなく、いくつかのドキュメントを読むほうがいいでしょう。 –

    +1

    @ HaoZonggang、* this ** **は、いつでも好きなときにnullまたは未定義にすることができます厳密なモードですが、それを行うのが適切なときには(呼び出された関数の* this *値が何であるか気にしないときはいつでも)尋ねるほうが良いかもしれません。グローバルオブジェクトに解決される非厳密モードであっても、* null *を使用してそれを示すことがあります。 – RobG

    +0

    @oriolこれはなぜ起こるのか知っています。 'str = String.fromCharCode.apply(String、rotCharArray);' –

    関連する問題