8
回答
碰到一个很有意思的 jQuery 闭包问题
华为云4核8G,高性能云服务器,免费试用   

代码如下:

$.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('开始执行');
})();

请问这是什么原因?

举报
李惟
发帖于7年前 8回/793阅
共有8个答案 最后回答: 7年前

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

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

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

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

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

firerfox   错误调试台

在“错误”栏你能看到。

我用的是1.6.1正式版

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

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

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

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

返回结果是未定义的

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

引用来自“fly020212”的答案

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

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

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

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

返回结果是未定义的

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

谢谢
顶部