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是定义在outpuNumbers()活动对象中,因此从它有定义開始,就能够在函数内部随从訪问它。即使像以下这样错误地又一次声明同一个变量,也不会改变它的值。

function outputNumbers(count){
    for(var i=0; i< count; i++){
        alert(i);
    }
    var i;     //又一次声明变量
    alert(i);  //count
}

Javascript从来不会告诉你是否多次声明了同一个变量;遇到这样的情况,它会对后面的声明视而不见,可是会运行兴许声明中的变量初始化。匿名函数能够用来模仿块级作用域并避免这个问题。

(function(){
    //这里是块级作用域
})()

上面代码定义并马上调用了一个匿名函数。将函数声明包括在一对圆括号里,表示它实际上是一个函数表达式。而紧随其后的还有一对圆括号会马上调用这个函数,

第二种方法:

var someFunction = function(){
    //这是块级作用域
};
someFunction();

上面样例先定义一个函数,然后马上调用它。定义函数的方式是创建一个匿名函数,并把匿名函数赋值给变量someFunction。而调用函数的方式是在函数名称后面加入一对圆括号,可是须要注意的是函数值并不能代替函数名,如

function(){
    //这里是块级作用域
}();

这样会导致语法错误,由于Javascript将functionkeyword当作一个函数声明的開始,而函数声明后面不能有圆括号。表达式后面能够跟圆括号

时间: 2024-10-27 08:01:23

javascirpt怎样模仿块级作用域(js高程笔记)的相关文章

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

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(){

JS 模仿块级作用域

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

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

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

函数调用的几种方法 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打印出来就是

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

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

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

模仿块级作用域 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模仿块级作用域

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); //出错 这方法可以理解为把块级作用域放在一个