js私有作用域(function(){})(); 模仿块级作用域

摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html

js没有块级作用域,简单的例子:

for(var i=0;i<10;i++){
alert(i);
}
alert(i);

for循环后的i,在其它语言像c、Java中,会在for结束后被销毁,但js在后续的操作中仍然能访问到i值,即for循环后的alert(i);会弹出数值i=10;

js模仿块级作用域:

(function(){
for(var i=0;i<10;i++){
alert(i);
}
})();
alert(i);

js私有作用域(模仿块级作用域) 语法格式:

(function(){
//这里是块级作用域
//作用:限制向全局作用域中添加过多的变量和函数,即避免内部临时变量影响全局空间
})();

将函数声明包含在一对()中,表示该函数实际是一个函数表达式(注:函数表达式后面可以跟(),要将函数声明转换成函数表达式,只需用()将函数声明包括起来即可),而紧随其后的另一对()会立即调用这个函数。

因此(function(){})(); 可理解成定义了一个函数表达式后,并立即调用该函数表达式,即等同于定义了:

var someFunction=function(){}()

var someFunction=function(){};
someFunction();

值得注意的是(function(){})(); 后面是有带分号;的,不带这个分号,(function(){})()后面的代码会报错的!这个,联合上面函数表达式后面的分号;来看就可解释为什么要带这个分号了。

(function(){})() 第2个括号可带多个参数,形如:

(function(arg1,arg2){
})(arg1,arg2);

var someFunction=function(arg1,arg2){}(arg1,arg2);

若第2个括号带了参数,则后面调用该函数必须带相应的参数,否则会报错,如:

someFunction()
不带参数会报错:Uncaught TypeError: undefined is not a function
时间: 2024-10-26 19:21:38

js私有作用域(function(){})(); 模仿块级作用域的相关文章

JS 模仿块级作用域

function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i;  // 重新声明变量 console.log(i);  // 计数 } 上述中,重复声明了i变量,但是JS从来不会告诉你是否多次声明了同一变量:遇到这种情况,它只会对后续的声明视而不见 不过,它会执行后续声明中变量的初始化.匿名变量可以用来模仿块级作用域并避免这个问题. (function() { // 这里是块级作用域(私

javascript中的闭包、模仿块级作用域和私有变量

闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式为:在一个函数内部创建另一个函数. "当某个函数被调用时,会创建一个执行环境(execution context)及相应的作用域链.然后,使用arguments和其他命名参数的值来初始化函数的活动对象(activation object).但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象出于第三位.....直至作用域链终点的全局执行环境." function creawteCompariso

JS函数表达式 -- 模仿块级作用域

JavaScript没有块级作用域的概念.这意味着在语句中定义的变量,实际上是在包含函数中而非语句中创建的. 1 function outputNumbers(count){ 2 for(var i=0; i<count; i++){ 3 alert("In: " + i); 4 } 5 var i; 6 alert("Out: " + i); 7 } 8 outputNumbers(2); //In: 0 In: 1 Out:2 在这个函数中定义了一个for

javascirpt怎样模仿块级作用域(js高程笔记)

因为javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包括函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i=0; i< count; i++){ alert(i); } alert(i); } 这个函数中定义了一个for循环,而变量 i 的初始值被设置为0.在Java.C++等语言中,变量i仅仅会在for循环的语句块中有定义,循环一旦结束,变量i就会被销毁.但是Javascript中,变量i是定义在out

javascirpt如何模仿块级作用域(js高程笔记)

由于javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i=0; i< count; i++){ alert(i); } alert(i); } 这个函数中定义了一个for循环,而变量 i 的初始值被设置为0.在Java.C++等语言中,变量i只会在for循环的语句块中有定义,循环一旦结束,变量i就会被销毁.可是Javascript中,变量i是定义在outp

函数表达式-模仿块级作用域

模仿块级作用域 Javascript中没有块级作用域的概念,这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的 1 function outputNumbers(count){ 2 for (var i = 0; i < count; i++){ 3 console.log(i); 4 } 5 console.log(i); 6 } 在for循环中定义的局部变量i可以再for循环外访问,因为变量i是定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函

函数调用的几种方法 几种主流框架使用匿名函数模仿块级作用域的方式

函数调用的几种方法 js 里函数调用有4种模式:方法调用.正常函数调用.构造器函数调用.apply/call 调用.同时,无论哪种函数调用除了你声明时定义的形参外,还会自动添加2个形参,分别是 this 和 arguments.这里你既然问 this,那么就只谈 this.this 的值,在上面4中调用模式下,分别会绑定不同的值.分别来说一说:方法调用:这个很好理解,函数是一个对象的属性,比如 var a = { v : 0, f : function(xx) { this.v = xx; }

javascript模仿块级作用域

作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. 先看一段代码: function outPut(){ for(i=0;i<5;i++) { console.log(i);//0,1,2,3,4 第一个i } console.log(i);//5 第二个i }; 解释:在java等语言中,for循环这块代码中的i变量将会被销毁,第二个i打印出来就是

js模仿块级作用域

var i = 5; var i; alert(i); 当一个变量被声明赋值之后,如果再对其声明,则不会改变上一次赋值后的值,所以i的值还是5,只有重新赋值之后,才会改变,如: var i = 5; var i = 6; alert(i); i现在的值是6: JS中没有块级作用域,如果想要块级作用域的效果,可以进行模仿,如: (function () { for (var i = 0; i < 5; i++) { } })(); alert(i); //出错 这方法可以理解为把块级作用域放在一个