为什么可以'是否将函数分配给变量并保留其功能
Why can't functions be assigned to variables and keep their functionality?
这很有效:
var foo = $("#bar");
foo.html("Hello.");
这不是:
var foo = $("#bar").html;
foo("Hello.");
是什么破坏了功能?
这应该是:
var bar = $("#bar");
var foo = bar.html.bind(bar);
foo("Hello.");
在第二个示例中,当您将html函数分配给foo变量时,它失去了调用上下文。
jQuery在调用它们的函数时引用this
。如果我们用类似bind
的东西设置this
,我们可以使您的示例工作。
https://jsfiddle.net/ripter/6hbqtn5j/
// Normal case
//$('#bar').html('<h1>Hello World</h1>');
// save the html function for later
// jQuery relies on 'this', so we have to make sure we keep that reference.
var barHtml = $('#bar').html.bind($('#bar'));
barHtml('<h1>Hello from function reference</h1>');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="bar">
</div>
html()
的引用在您的示例中不起作用的原因是,当您调用函数时,this
的范围在函数中发生了变化。
在通常的示例(即$('#bar').html('Hello.')
(中,this
指的是jQuery对象中的DOME元素。
在函数引用版本中,this
已更改为指向window
。要解决此问题,需要使用call()
调用提供this
作用域的html()
方法引用。
从下面的示例中可以看出,这并没有多大帮助,因为您需要调用DOM两次才能检索#bar
元素。
var foo = $("#bar").html;
foo.call($("#bar"), "Hello.");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="bar"></div>
bind()
也将获得相同的结果,并且具有完全相同的缺点。
当您调用html方法时,您需要在那时传入args。简单地说,它就是不起作用。如果你做了
var myHtml = 'hello world';
var foo = $('#bar').html(myHtml);
你会发现它有效。当调用一个方法时,参数应该与其关联。。。您实际上是在为Jquery对象分配一个属性"html",它覆盖了该方法。我很确定。。。
相关文章:
- Javascript 将变量分配给警报
- Javascript变量分配-按类别
- 为变量分配多个nodejs导出返回值时出现问题
- 使用Javascript中的回调处理变量分配
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 使用一个表达式将两个变量分配给相同的值
- 将变量分配给函数在JavaScript中不起作用
- 如何在yahoo weather中将变量分配到javascript src脚本中
- 服务变量分配了数据,但在访问时始终未定义
- 如何在用户单击提交按钮时为变量分配任意值
- 将JavaScript变量分配给同一页面上的PHP变量
- Javascript是否为具有未定义值的变量分配32位内存
- 为变量分配回调函数
- 如何在javascript中为单个变量分配多个值
- 将全局变量分配给以下 Javascript
- 如何将变量分配给链接中包含的信息?(Javascript/HTML)
- 如果我为 JS 变量分配一个新值,它会破坏它的绑定吗?
- 如何将 javascript 变量分配给隐藏的输入
- 为变量分配有限集合中的随机元素
- 如何使用由多行组成的 django 模板变量分配 javascript 变量