Javascript применяется или вызов используется на charCodeAt - PullRequest
5 голосов
/ 19 августа 2011

Предпосылка: как должна выглядеть правильная производительность charCodeAt (i: Int):

"test".charCodeAt(0)
116
"test".charCodeAt(1)
101
"test".charCodeAt(2)
115
"test".charCodeAt(3)
116
"test".charCodeAt(4)
NaN

и вот что происходит при использовании call или apply:

>"test".charCodeAt.apply(this, [0,1,2,3])
91
//that's fine, except for 91!
"test".charCodeAt.call(this,0)
91
"test".charCodeAt.call(this,4)
101
"test".charCodeAt.call(this,5)
99
"test".charCodeAt.call(this,50)
NaN
"test".charCodeAt.call(this,6)
116
"test".charCodeAt.call(this,8)
68

x = "test".charCodeAt
function charCodeAt() { [native code] }
x.call(x,0)
102

Аргументы передаются правильно.Он касается объема, который передается с первым аргументом вызова или применения и изменяет значениеOf из указателя this .

Я не совсем уверен, что произошло, и не смогвоспроизведите поведение в новом окне консоли (Chrome v15):

x = "test"
"test"

"".charCodeAt.call(this.x,0)
116
OK.

Что касается вопроса: когда область действия не указана с помощью this.x , а только x - в этом примере может странное поведение привести к разрешению области действия интерпретатора JS?Кто-нибудь сталкивался с подобными случаями со странными конфликтами в области видимости?

Ответы [ 2 ]

6 голосов
/ 19 августа 2011

Во всех этих вызовах, таких как:

"test".charCodeAt.call(this, 0);

значение this, скорее всего, будет window, а не любое строковое значение.Попробуйте это:

var string = "test";
string.charCodeAt.call(string, 0);

Если вы передадите что-то поддельное для this, вы не сможете ожидать, что оно будет работать должным образом :-) Причина, по которой это работает, когда вы определяете переменную "x", а затем ссылаетесь«this.x», опять же, означает, что this равен window, поэтому «this.x» совпадает с «window.x», что даст вам вашу переменную.

1 голос
/ 19 августа 2011

this - это window в вашем случае и window.toString() === "[object Window]".Итак, вы работаете с этой строкой.

Если вы хотите, чтобы функция charCodeAt была лучше, используйте var foo = String.prototype.charCodeAt;, а затем вызовите ее для некоторой строки: foo.call('meow', 0)

...