"这个“;当我向事件处理程序函数添加参数时会发生更改
"this" changes when I add parameters to event handler function
我最近开始学习javascript,在理解方面遇到了一些障碍。以下内容可能是Kinetic.js特有的,我不确定。无论如何,最好用一个例子来说明。http://jsfiddle.net/Y6Eww/1/
var stage = new Kinetic.Stage({
container: 'container',
width: 578,
height: 200
});
var layer = new Kinetic.Layer();
var circle = new Kinetic.Circle({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2 + 10,
id: "TheCircle",
radius: 70,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
draggable: true
});
var dragendHandler = function dragendHandler() {
console.log(this);
};
var dragstartHandlerParams = function dragstartHandlerParams(param1) {
console.log(this+param1);
};
circle.on('click', function() {
console.log(this);
});
circle.on('dragend', dragendHandler);
circle.on('dragstart', dragstartHandlerParams("ROCK"));
layer.add(circle);
stage.add(layer);
document.getElementById('removeClick').addEventListener('click', function() {
circle.off('click');
alert('onclick removed');
}, false);
参考jsfiddle,我做了以下操作:
- 按下Run(运行)按钮
- 拖动圆(触发拖动开始和拖动结束)
- 单击圆
这将导致以下控制台输出:
[object Window]ROCK => Occurs after step 1.
Uncaught TypeError: Cannot call method 'call' of undefined kinetic-v4.6.0.min.js:2 => Occurs after step 2.
Kinetic.Circle {} => Occurs after step 2.
Kinetic.Circle {} => Occurs after step 3.
所以我的问题是:
- 当jsfiddle最初运行时,为什么
[object Window]ROCK
会向控制台输出?拖动启动没有发生,所以这不应该是原因。dragstartHandlerParams
和dragendHandler
都是监听拖动事件的函数表达式,所以我希望它们的行为相同(在这一点上,似乎没有执行dragendHandler
) - 为什么
this
的上下文在dragstartHandlerParams
和dragendHandler
之间发生变化 - 为什么
dragstartHandlerParams
不能作为处理程序工作?请注意,如果我在调用时省略参数,它确实有效 - 如果问题3的答案是"因为它需要一个事件参数",我该如何将数据传递给事件处理程序?据我所知,Kinetic.js
#on
函数不像jQuery#on
函数那样传递数据
提前感谢您的帮助。
问题是,以下命令立即调用dragstartHandlerParams
,并将其return
值(在本例中为undefined
)传递给circle.on()
。
circle.on('dragstart', dragstartHandlerParams("ROCK"));
要在不调用函数的情况下指定参数,可以使用.bind()
。
circle.on('dragstart', dragstartHandlerParams.bind(circle, "ROCK"));
或者,您可以修改dragstartHandlerParams
以返回一个新的function
,将其传递给已关闭参数的circle.on()
。
var dragstartHandlerParams = function dragstartHandlerParams(param1) {
return function () {
console.log(this+param1);
};
};
相关文章:
- 将GET参数添加到q.io.xhr
- iron路由器将参数添加到字符串中,并添加一个查询
- Nodejs-使用regex将多个参数添加到路由中
- setTimeout向函数参数添加条件
- 将 CakePHP 命名参数添加到列表选择的 URL 中
- 在这种情况下,如何使用参数添加回调
- Ajax 帖子将参数添加到主页链接
- 将查询字符串参数添加到 GridView 项模板
- 如何正确地将 URL 参数添加到 AJAX 数据对象
- 将查询参数添加到 URL
- Google Apps 脚本 - 将横向参数添加到 PDF 电子邮件附件
- 将参数添加到现有 URL
- 使用 Javascript 将参数添加到 URL
- 如何将参数添加到序列化对象
- 将参数添加到 d3 拖动行为后,元素不再可拖动
- 向 ajax 参数添加循环
- 如何将url参数添加到requirejs中的特定路径
- 如何在WordPress中将查询字符串/参数添加到url
- 如何将参数添加到存储在稍后调用的数组中的方法中
- 如何将参数添加到url_for