【问题标题】:Javascript apply or call used on charCodeAtcharCodeAt 上使用的 Javascript 应用或调用
【发布时间】:2011-10-30 16:33:42
【问题描述】:

前提:正确的 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

参数正确传递。它是关于与 call 或 apply 的第一个参数一起传递的范围,并从 this 指针更改 valueOf。

我不确定发生了什么,并且无法在新的控制台窗口 (Chrome v15) 中重现该行为:

x = "test"
"test"

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

至于问题:当范围没有用 this.x 指定但只有 x -在这个例子中,可以 奇怪的行为 em> 结果是由于 JS 解释器的作用域解析吗? 有人遇到过奇怪的范围冲突的类似案例吗?

【问题讨论】:

  • 我刚刚看了你的博客,你正在扩展宿主对象的原型。这通常很危险。不过对于String,它是安全的。但请永远不要尝试为ArrayObject 这样做。
  • @ThiefMaster 好吧,这可能不是每个人都喜欢做的事情,但是一些库(功能、原型)使用原生对象的扩展作为基本的架构方法。

标签: javascript browser scope call this


【解决方案1】:

this 在你的情况下是 windowwindow.toString() === "[object Window]"。 所以你正在使用那个字符串。

如果您希望charCodeAt 函数更好地使用var foo = String.prototype.charCodeAt;,然后在某个字符串上调用它:foo.call('meow', 0)

【讨论】:

  • >this.toString() "[object DOMWindow]" 完美,这回答了为什么字符串的可访问索引大约为 20!
【解决方案2】:

在所有这些电话中,例如:

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

this 的值很可能是window,而不是任何字符串值。试试这个:

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

如果你为this 传递了一些虚假的东西,你不能指望它正常工作:-) 当你定义一个变量“x”然后引用“this.x”时它工作的原因是,再次,即thiswindow,因此“this.x”与“window.x”相同,这将为您获取变量。

【讨论】:

  • @Joey 但它只是一个变量名; "String" 是预定义的构造函数名称。
  • String.prototype.charCodeAt.call(string, 0) 是最合适的。
  • @ThiefMaster 是的,没错,如果出于某种原因需要隔离函数,最好直接将其从原型对象中取出。为了清楚起见,我试图与原始问题保持平行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2013-02-17
相关资源
最近更新 更多