碰到一个很有意思的 jQuery 闭包问题

李惟 发布于 2011/10/14 10:31
阅读 858
收藏 0

代码如下:

$.fn.test = function(elem, parent)
{
	alert(this);
}

(function()
{
	alert('开始执行');
})();

执行的时候,会先打印$.fn.test中的this,然后报错:

错误: function (elem, parent) {alert(this);}(function () {alert("\u5F00\u59CB\u6267\u884C");}) is not a function

如果将代码改成这样就没有问题了:

(function()
{
	$.fn.test = function(elem, parent)
	{
		alert(this);
	}
	
	alert('开始执行');
})();

请问这是什么原因?

加载中
0
梵高
梵高
第五行少了一个分号!!
0
魔力猫
魔力猫

我没有遇到错误。只是提示框的内容是[object],然后就没有了。

请详细说明你的jquery版本和浏览器版本。

0
mark35
mark35

这样呢?

$.fn.test = function(elem, parent)
{
	alert(this);
};

(function()
{
	alert('开始执行');
})();

 

0
李惟
李惟

引用来自“魔力猫”的答案

我没有遇到错误。只是提示框的内容是[object],然后就没有了。

请详细说明你的jquery版本和浏览器版本。

firerfox   错误调试台

在“错误”栏你能看到。

我用的是1.6.1正式版

0
fly020212
fly020212

确实是少一个分号,但意思差别就好大了

$.fn.test = function(elem, parent) { alert(this); } ( function() { alert('开始执行'); } )  ();

这个相当于是
定义匿名函数 function(elem, parent) , 实现函数 { alert(this); } ,

用函数 function() { alert('开始执行'); } 作为参数 调用执行

返回结果是未定义的

再次调用执行 () 当然会出错了,因为之前返回的结果不是函数

0
微凉的风
微凉的风

代码写的不严谨,跟闭包没关系吧

0
李惟
李惟

引用来自“高老庄壮猪”的答案

第五行少了一个分号!!
这个以前真没注意过。
0
李惟
李惟

引用来自“fly020212”的答案

确实是少一个分号,但意思差别就好大了

$.fn.test = function(elem, parent) { alert(this); } ( function() { alert('开始执行'); } )  ();

这个相当于是
定义匿名函数 function(elem, parent) , 实现函数 { alert(this); } ,

用函数 function() { alert('开始执行'); } 作为参数 调用执行

返回结果是未定义的

再次调用执行 () 当然会出错了,因为之前返回的结果不是函数

谢谢
返回顶部
顶部