最近在看一些javascript的代码 不知道(function{})()这种写法什么一个意思,应该是跟闭包有关系。但是就是搞不清楚里面定义的 一些对象和属性是如何的一个应用范围,什么时候被创建等,各位大虾指教一下吧~~感谢~
以ext为例有这么一段:
(function() {
Ext.lib.Scroll = function(el, attributes, duration, method) {
if (el) {
Ext.lib.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
}
}; Ext.extend(Ext.lib.Scroll, Ext.lib.ColorAnim);
var Y = Ext.lib;
var superclass = Y.Scroll.superclass;
var proto = Y.Scroll.prototype; proto.toString = function() {
var el = this.getEl();
var id = el.id || el.tagName;
return ("Scroll " + id);
}; proto.doMethod = function(attr, start, end) {
var val = null; if (attr == 'scroll') {
val = [
this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),
this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)
]; } else {
val = superclass.doMethod.call(this, attr, start, end);
}
return val;
}; proto.getAttribute = function(attr) {
var val = null;
var el = this.getEl(); if (attr == 'scroll') {
val = [ el.scrollLeft, el.scrollTop ];
} else {
val = superclass.getAttribute.call(this, attr);
} return val;
}; proto.setAttribute = function(attr, val, unit) {
var el = this.getEl(); if (attr == 'scroll') {
el.scrollLeft = val[0];
el.scrollTop = val[1];
} else {
superclass.setAttribute.call(this, attr, val, unit);
}
};
})()
以ext为例有这么一段:
(function() {
Ext.lib.Scroll = function(el, attributes, duration, method) {
if (el) {
Ext.lib.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
}
}; Ext.extend(Ext.lib.Scroll, Ext.lib.ColorAnim);
var Y = Ext.lib;
var superclass = Y.Scroll.superclass;
var proto = Y.Scroll.prototype; proto.toString = function() {
var el = this.getEl();
var id = el.id || el.tagName;
return ("Scroll " + id);
}; proto.doMethod = function(attr, start, end) {
var val = null; if (attr == 'scroll') {
val = [
this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),
this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)
]; } else {
val = superclass.doMethod.call(this, attr, start, end);
}
return val;
}; proto.getAttribute = function(attr) {
var val = null;
var el = this.getEl(); if (attr == 'scroll') {
val = [ el.scrollLeft, el.scrollTop ];
} else {
val = superclass.getAttribute.call(this, attr);
} return val;
}; proto.setAttribute = function(attr, val, unit) {
var el = this.getEl(); if (attr == 'scroll') {
el.scrollLeft = val[0];
el.scrollTop = val[1];
} else {
superclass.setAttribute.call(this, attr, val, unit);
}
};
})()
相当于先定义 function xx(){},后调用 xx();
()是最高优先级的,所以先执行function(){},
这个定义了一个匿名函数,等于xx=function(){}
接着就是调用xx()了;如果函数定义是用到了变量,在执行的时候可能不存在的话,可通过此方法先将变量作为参数出入,
在定义时先将值固定下来。
for(var i=0;i<x;i++) xxx.onclick=(function(n){ return function(){alert(n)}; })(i);
alert(a);
}function f2(a){
return function(){
alert(a);
}
}
这里的var x=f2 就等于把函数传递给了f2,然后要执行这个函数,就必须加() 也就是x();
也就是f2()
还是(function f2(a){
return function(){
alert(a);
})()不知这样是否清楚点
例如:
YY = YY||{};---声明一个叫YY的命名空间(定义一个全局的变量)
(function() {
YY.Lang=function() {------声明一个叫YY.Lang的命名空间(通过全局变量的增加属性的方式把闭包里的对象传到全局变量中,实现代码封装的效果)
isUndefined: function(o) {
return typeof o === 'undefined';
},
isString: function(o) {
return typeof o === 'string';
}
};})();---调用方法
alert(YY.Lang.isString('test me'));不知道这么理解有没有错,各位大虾再指点一下呗?
//(
function()
{
YY.Lang=function() {------声明一个叫YY.Lang的命名空间(通过全局变量的增加属性的方式把闭包里的对象传到全局变量中,实现代码封装的效果)
isUndefined: function(o) {
return typeof o === 'undefined';
},
isString: function(o) {
return typeof o === 'string';
}
};}//)();---调用方法
alert(YY.Lang.isString('test me'));
注释掉这两行有什么不一样的呢?不就是申明吗,为什么要用()()执行一下啊?
但是,如果按照你写的function aa(){..};//只是定义了一个叫aa的函数,但是并没有执行
alert(YY.Lang.isString('test me')); //执行的时候会报找不到isString的方法。
另外补充一个说明,刚请教同事。
(function{})()的写法有个好处,就是能很好的利用javascript的变量的可见范围为执行脚本时节省空间。例如以下写法1和写法2达到的目的是一样的,但是写法1的由于a变量的可见范围只是在匿名函数体内,所以a在执行完这个匿名函数后就释放空间了。但是写法2会一直存在该页面中。
写法1:(function(){
var a = 2;
alert(a);
})();写法2:
var a = 2;
alert(a);不知道还有什么补充没?有交流才有进步,呵呵~