6
var example = function () {
  console.log(typeof this);
  return this;
};

厳密モード:example.call('test') # prints 'string'

さもないと、example.call('test') # prints 'object'

ただし、 (ご想像のとおり)console.log(example.call('test'))印刷testされます

Function.callchangeがinside にtypeof 'test' === 'string'バインドされるのはなぜですか?thisexample

4

1 に答える 1

6

引数を使用してプリミティブ値にcall()設定するとthis、そのプリミティブ値は常にオブジェクトに変換されるため、プリミティブ文字列ではなく文字列オブジェクトが取得されます。

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ...

call()on MDNのドキュメントには、次のように記載されています。

thisArg関数の呼び出しに提供される
値 これは、メソッドによって表示される実際の値ではない可能性があることに注意してください。メソッドが非厳密モード コードの関数である場合、グローバル オブジェクトに置き換えられ、プリミティブ値がオブジェクトに変換されます。this
nullundefined

したがって、非厳密モードでは、プリミティブ文字列値がオブジェクトに変換されます。これは、ECMA 標準の Annex Cでも指定されています。

厳密モードの制限と例外が厳密モード コード内で評価される
場合値はオブジェクトに強制されません。または の this 値はグローバル オブジェクトに変換されず、プリミティブ値はラッパー オブジェクトに変換されません。関数呼び出し ( および を使用して行われた呼び出しを含む) を介して渡さ たた値をオブジェクトに強制しません。thisthis
nullundefined
thisFunction.prototype.applyFunction.prototype.callthis

于 2015-08-24T19:58:37.697 に答える