日期:2014-05-16  浏览次数:20376 次

关于这段语法的解释

(function(){
        var   x1=0;
        var   b1=0;

        point=function(x,y)
        {
                this.x=x||x1;
                this.y=y||b1;
        }
})();

这是啥意思?这样定义有什么用?和直接定义这么一个函数有什么区别?初学者,求稍详细的解释

------解决方案--------------------
匿名函数。
http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html
------解决方案--------------------
闭包: 闭包的内部环境对外部不可见,对外封闭
Javascript 闭包是通过function实现的,所以它具有函数的基本特征,在闭包里声明的变量,闭包外的环境无法访问,除非它提供对外接口
------解决方案--------------------
<script>
<!--
function dwn(s)
{
document.write(s + "<br/>");
}
//我们说匿名函数调用产生一个"瞬时"的闭包
//因此当调用结束后,私有变量无法访问,并且如果没有外部引用存在
//内部对象就会被销毁
//而如果返回了函数,或者被全局引用,则"闭包"被保留了下来
//闭包中的内容被"有选择"地开放出来
(function(){
//封闭的私有域
var innerX = 10, innerY = 20;

//开放的公共域
outerObj = {x : innerX, y : innerY} ;
})();

try{
dwn(innerX); //内部数据无法访问
}
catch(ex){
dwn("内部数据无法访问");
}
dwn(outerObj.x); //通过外部接口访问
-->
</script>
------解决方案--------------------
(function(){ 
var x1=0; 
var b1=0; 

point=function(x,y) 

this.x=x||x1; 
this.y=y||b1; 

})(); 
我来解释一下,我看楼上的都童鞋都不是很贴近主题,
1. 首先说一下最外层的小括号,和后面跟着的小括号的意思:就是执行里面这个自定义的匿名函数,例如
(function(n){
alert(n) 
})(1)
这个例子放在html里面的话就会直接弹出alert(1)

2. 这里说一下 point=function(x,y) 

this.x=x||x1; 
this.y=y||b1; 
} 这个代表的意思,
(1) 首先 point 前面没有加var 表示point是全局变量,
(2) 指定定义函数 和赋值定义函数是有区别的,例如
function point(x,y){...} 这个是有区别的,js会先定义变量,在计算,就是说在一个作用域内(通常是一个函数内)js会先把所有需要定义的变量定义,然后在顺序执行运算,也就是说在一个js函数里面,无论你的定义变量的代码放在哪里,都没有影响.

3. 这里要说的就是楼上也由提到的闭包,闭包是一个博大精深的js理念,这里我不多说了,楼主想研究闭包可以自己google,这里我就说一下楼主贴出来的代码,
在这段js里面point函数是没有全力操作x1和b1的,相对point来说 这两个变量和全局变量没区别,但是,注意,只是相对于point来说的,他们的访问权限只是限制于外围的这个匿名的函数,当然包括point,这个匿名函数外部是没有权限访问的,着就巧妙的实现了一种变量作用域权限的控制,当我们想实现全局变量的效果,但是又不想定义全局变量时,(全局变量当然是尽量慎用了,不安全),闭包(也就是类似于上面这种用法,只是类似)就是很好的一种实现.

最后解释一下这个代码的意思:将point全部变量赋值,变成一个函数,这个函数的作用是如果调用point时没有传进来参数,就用x1,和b1来初始化这个匿名函数的成员变量x和y,解释一下,在一个函数内用this.xxx就是定义了一个相对于这个函数的成员变量,
纯手打.
------解决方案--------------------
(function(){ 
var x1=0; 
var b1=0; 

point=function(x,y) 

this.x=x||x1; 
this.y=y||b1; 

})(); 
在内部调用时候 比如 var abc=new point() 初始化 abc.x=0,abc.y=0
再如
var def=new point(2,3) 则 def.x=2 def.y=3

需要注意的是 point 再跳出 })(); 后 无效