JS-作用域划分

和其他语言不通的是,js的作用域是按函数来划分的;不像C 语言,java等高级语言,有严格的块级作用域的区分,在java中for或者if都算是一个独立的块级作用域,但是在JavaScript中if、for 语句中的花括号不是独立的作用域。JavaScript 的作用域完全是由函数来决定的。比如

if (true) {
   var name = 'zhangsan';
}
console.log(name); // 输出 zhangsan

上面的代码在c语言和java中会出现变量未定义的错误,因为在Java中if(true){...}是独立的作用域,在if里面定义的变量,在if外面是访问不到的;但是在js中if不算独立的作用域,所以在if外面照样可以访问到局部变量name.在比如下面代码:

function test(){
for(var i=1;i<5;i++){
alert(i);
}
alert("外部调用 i 的值是:" + i); //  外部调用 i 的值是 5
}

同样在for循环外面照样可以访问到局部变量i,那么在js中也想实现java中的效果:“想让for循环结束之后变量i就无法在for循环外访问了。可以实现吗???

答案是:当然可以!!

怎么实现那??需要通过JavaScript中的自执行函数表达式,在这里如果不明白函数表达式 和 自执行 是怎么回事的小伙伴请参考我的另一篇文章《js函数声明和函数表达式

(function(){
  for(var i=1;i<5;i++){
   alert(i);
  }
})(); 

这就是一个自执行的函数表达式

function test(){
        (function(){
            for(var i=1;i<5;i++){
                alert(i);
            }
        })();
        alert("外部调用 i 的值是:" + i);//这是再访问i,就访问不到了
  }
  test();

这里再for循环的外面在访问i就报i未定义的错误了

由此可知:在js中如果 想让一段代码中的局部变量,在这段代码之外不被访问到,就可以通过自执行函数表达式来实现;这样往往能够避免和外部代码发生冲突。

换句话说可以通过 js中的自执行函数表达式 来实现java等高级语言中的块级作用域。

时间: 2024-11-16 02:21:16

JS-作用域划分的相关文章

关于js作用域

我们知道在编程语言中,作用域的作用就是控制变量.参数的可见范围和生命周期. js中提供了函数作用域的功效,比如在函数中定义的变量外部是无法访问到的: function jsFunc(){ var a = 5; } alert(a); // undefined 但是js中却没有提供块作用域的功效,比如我们在java代码中如果些如下代码: public static Boolean b = false; public static void main(String[] args) { if(!b){

js作用域理解 function(){} var

在coding过程中遇到过下面的情况: 1 var test1 = function(){ 2 var c=4; 3 test2(); 4 }; 5 6 var test2 = function(){ 7 console.log(c); 8 }; 9 10 test1(); 思考一下,7行会conasole出什么?4 吗?实际上却是 c is not defined. 而当代码如下的时候, 1 var test1 = function(){ 2 var c=4 3 var test2 = fun

js作用域的几个问题

按照<权威指南>的说法,全局的变量作用域是全局性的,在js代码中,他处处都有定义.而在函数之内声明的变量,就只有在函数体内有定义了.函数的参数也是局部变量,他们只在函数体内部有定义.在函数体内部,局部变量的优先级比同名的全局变量高.如果给一个局部变量或函数的参数声明的名字与全局变量的名字相同,那么就有效地隐藏了这个全局变量. js没有块级作用域,,函数中声明的所有变量,无论在哪里,如for ,if等,在整个函数中他们都是有定义的.这个也叫变量提升,作用域都是在函数中. 1,对象内部的作用 ?

JS作用域链

Js作用域与执行环境: 1. 作用域链: <1>用途:保证对执行环境有权访问的所有变量和函数的有序访问. <2>构成: a.作用域链的前端,始终都是当前执行代码所在环境的变量对象(如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象): b.下一个变量对象来自包含(外部)环境: c.最后一个对象,为全局执行环境的变量对象. <3>标识符解析:是沿着作用域链一级一级地搜索标识符的过程,始终从作用域链的前端开始,然后逐级

JS作用域面试题总结

关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量)内部可以访问外部,但外部的不能访问内部的(局域变量) var a=10; function aaa(){ alert(a); }; aaa(); //a 为外部变量即全局变量,所以可以直接访问到 结果为10 function aaa(){ var a=10; }; aaa(); alert(a);

基础知识回顾——js作用域

1.对js作用域的理解. 作用域 作用域分为全局作用域和函数作用域,我们可以理解为变量的生存环境(空间).全局作用域包含函数作用域,函数作用域里的变量可以访问到全局作用域中的变量,但是反之则不行. 变量提升 在js作用域中还有变量提升的现象(只有var 声明的变量才会有变量提升,window声明的不会),赋值语句最后生效.当我定义一个变量,如果它没有被赋值,它是属于undefined: 变量提升的优先级 函数声明 > 函数形参(函数的形参属于函数作用域:) > 自定义变量 延长作用域,闭包(r

闲话js作用域

js词法环境包括环境变量绑定及外部引用'函数创建的时候有个内部属性[[scope]],它指向当前函数的词法环境对象.而词法环境的外部引用一个词法环境'直到全局词法环境'它外部引用为null'这样就构成作用域链.当进入可执行代码时'会创建执行环境'执行环境包括词法环境变量环境及this关键字绑定'如果是函数'它还会创建一个新的词法环境对象添加到当前作用域链前端'此为活动对象'活动对象的外部引用为此前的最上层执行环境' 闲话js作用域

easyui datagrid load 封装 参数问题 js 作用域

var temp = { LoginAccount: $('#LoginAccount').val(), ShopName: $('#ShopName').val() }; function doSearch1() { $('#datagrid').datagrid('load', temp); } function doSearch2() { $('#datagrid').datagrid('load', { LoginAccount: $('#LoginAccount').val(), Sh

js作用域零碎的知识点,不同的script块,虽然同是全局变量

如下代码,第一次弹出a,因为解析器里找到var a,赋予a变量undefined,弹出undefined 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>js作用域</title> 6 <script type="text/javascript"> 7 alert(a); //第一次弹出a为u

JS(作用域)_关于作用域的注意点

一.前言 最近复习的时候总算是把以前作用域涉及到的模糊的概念弄得差不多了. 以下是几个关于js作用域中重要的概念 二.主要知识 1.Js因为 JavaScript 采用的是静态作用域,函数的作用域在函数定义的时候就决定了. 举例: 1 var value = 1; 2 3 function foo() { 4 console.log(value); 5 } 6 7 function bar() { 8 var value = 2; 9 foo(); 10 } 11 12 bar();//1 /*