我最近尝试在 javascript中使用map的实现来创建一堆项目,然后将它们应用于对象添加方法.

首先是沼泽标准的地图实现.

var map = function (fn,a)
{
    for (i = 0; i < a.length; i++)
    {
        a[i] = fn(a[i]);
    }
}

建立.

var translateMenu = new Menu;

var languages = [ ['Chinese','zh-CN'],['German','de'],['french','fr'],['Portugese','pt'],['hindi','hi']
                ];

而我的功能……(不是匿名的,因为它在将translateMenu添加到mainMenu时会被使用.)

var langItem = function (language,subMenu) 
    { 
       return new MenuItem(language[0],'http://translate.google.com/translate?u=www.example.com&hl=en&ie=UTF-8&tl=en&sl=' + language[1],"",subMenu); 

    }

map ( langItem,languages );

这一切都运行良好,我现在有一个MenuItems数组扔掉.

尝试调用map(Menu.add,语言)会导致Menu的内部变量未定义,并且调用失败.
现在我确定这与Menu.add()方法的范围有关,所以我想如果我也传入了对象,它可能会工作.

我尝试创建一个接受对象和函数的新map函数,但是具有相同的未定义错误.

objMap (fn,obj,a) {
    for (i = 0; i < a.length; i++)
    {
        obj.fn(a);
    }   
}
objMap ( add,translateMenu,languages );   // Failed

我通过使用addAll()扩展Menu来解决这个问题,以获得一个数组,这很好…

Menu.prototype.addAll = function (items){
    for (i = 0; i < items.length; i++)
    {
        this.add(items[i]);
    }
}

translateMenu.addAll( languages ); // yay! but I want a more elegant solution.

无论如何,我的问题是,我怎样才能实现map(或类似的泛型函数)来实际支持使用对象方法作为我的映射函数?

Trying to call map( Menu.add,languages )

在这里你的问题几乎肯定是JavaScript缺乏绑定方法.

通过检查方法的获取方式,仅在呼叫时确定函数的“this”设置.如果你说其中一个:

obj.method();
obj['method']();

JavaScript将获取对’obj’的引用,并在方法调用中设置’this = obj’.但如果你说:

obj2.method= obj.method;
obj2.method();

现在函数内的’this’将是obj2,而不是obj!

同样,如果从其对象中选择方法并将其作为第一类对象引用:

var method= obj.method;
method();

将’this’设置为没有对象,因此JavaScript将其设置为全局对象(也称为Web浏览器的“窗口”).这可能就是你的情况:’Menu.add’方法失去了对它所有者’Menu’的所有引用,所以当它被回调时,它很可能在不知不觉中写入’window’对象的成员而不是菜单.

对于OO语言来说,这当然是非常不寻常的,而且几乎从来都不是你想要的,但是嘿,这就是JavaScript如何滚动.导致无声,难以调试的错误都是该语言基本原理的一部分.

要解决此问题,您可以将对象引用传递给map函数,然后使用Function.call()/ apply()正确设置’this’引用:

function mapMethod(fn,sequence) {
    for (var i= 0; i<sequence.length; i++)
        sequence[i]= fn.call(obj,sequence[i]);
}

mapMethod(Menu.add,Menu,languages)

更通用的方法是使用闭包手动绑定函数引用:

function bindMethod(fn,obj) {
    return function() {
        fn.apply(obj,arguments)
    };
}

map(bindMethod(Menu.add,Menu),languages)

此功能将内置到未来版本的JavaScript中:

map(Menu.add.bind(Menu),languages)

通过写入Function.prototype.bind可以将此工具添加到当前浏览器中 – 事实上,一些JS框架已经存在.但请注意:

> ECMAScript 3.1承诺你也可以将额外的参数传递给bind()来执行部分函数应用程序,这需要比上面的bindMethod()更多的代码;>当您开始在DOM对象(如事件处理程序)上保留绑定方法等引用时,IE喜欢泄漏内存.

php – 在javascript中实现支持对象方法作为映射函数的映射?的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  6. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  7. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  8. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  9. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  10. iOS应用程序的UI自动化测试如何与乐器和Javascript

    从WWDC2010视频会议中了解iOS应用程序的自动化UI测试,但没有实践.从代码项目project,我们可以有一个例子.这个问题在这里听到有涉及这个的人.任何限制?解决方法我建议从AlexWollmer开始使用thisblogpost.他创建了一个非常有用的JavaScript库:tuneup_jswithtest()函数,它允许测试分离和有用的帮助者以及为自动化仪器编写测试的断言.

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部