d0c*_*age 2 javascript internet-explorer function
这段代码给了我一个SCRIPT5002: Function expected错误:
var callIt = function(func) { func(); }
Run Code Online (Sandbox Code Playgroud)
为什么!?这就像它试图进行类型检查或其他东西
编辑:用例
var callIt = function(func) { func(); }
function nextSlide() {
var fn = currSlide ? currSlide.hide : callIt;
currSlide = setupSlides[++slideIdx];
fn(currSlide.show());
}
Run Code Online (Sandbox Code Playgroud)
DOH!
你的代码:
fn(currSlide.show());
Run Code Online (Sandbox Code Playgroud)
... 调用 currSlide.show()并传递返回值从调用它fn,完全是foo(bar()) 调用 bar并传递其返回值的方式foo.
由于返回值show不是函数,因此会出现错误.你可能意味着:
fn(function() { currSlide.show(); });
Run Code Online (Sandbox Code Playgroud)
但请注意,您在此处遇到问题:
var fn = currSlide ? currSlide.hide : callIt;
Run Code Online (Sandbox Code Playgroud)
如果currSlide是真的,你将获得对该hide函数的引用,但该函数不以任何方式连接到currSlide.如果你稍后再打电话,它很可能会失败,因为它预计this意味着特定的东西.
如果你可以依靠ECMAScript5的功能(所以,你使用IE8以外的现代浏览器和/或你包含"es5 shim"),你可以通过以下方式解决这个问题Function#bind:
var fn = currSlide ? currSlide.hide.bind(currSlide) : callIt;
Run Code Online (Sandbox Code Playgroud)
或者如果您使用的是jQuery,可以使用jQuery修复它$.proxy:
var fn = currSlide ? $.proxy(currSlide.hide, currSlide) : callIt;
Run Code Online (Sandbox Code Playgroud)
这两个函数都返回一个新函数,当调用它时,它将使用给定this值调用目标函数.
如果您没有使用ES5或jQuery,那么这样做会:
var prevSlide = currSlide;
var fn = prevSlide ? function(func) { prevSlide.hide(func); } : callIt;
Run Code Online (Sandbox Code Playgroud)
......但在那一点上,我怀疑退后一步并重新评估可能是有序的.
| 归档时间: |
|
| 查看次数: |
13183 次 |
| 最近记录: |