js变量的作用域详解

量的作用范围又称为作用域,是指某变量在程序中的有效范围。根据作用域,变量可以分为全局变量和局部变量。
1  全局变量的作用域是全局性的,即在整个网页特效程序中,全局变量处处都在。
2  而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。

相信大家都知道,javascript中变量作用域只有两种,全局作用域与函数中的局部作用域(有人认为不同script节点间也存在一种作用域,称之为段作用域,理由是在后面的script的节点中定义的变量,在这个script节点没有被解析之前,前面的script节点是不能访问这个变量的,这种依赖于代码解析顺序的特殊情况,不在我们这篇文章的讨论之列)。

比如下面的代码:


var a = 1;
function f(b){
var c = 2;
}

a就是我们声明的全局变量,c就是我们声明的局部变量,b作为函数f的形参,也是一个局部变量。

我们再看下面的代码:


function outer(){
var o;
function inner(){
var i;
}
}

可以看到o和i都是局部变量,只不过o的作用域范围为函数outer的函数体,而i的作用域范围为inner的函数体。

我们再看一段代码:

 


var g = 1;

 function outer(){

  var o = 1;

  function inner(){

  var i = 1;

  debugger;

  }

  inner();

 }

 outer();

debugger?没错,就是debugger。呵呵,我们单独运行这段代码,打开浏览器的调试环境,比如ff浏览器的firebug

我们选择脚本这一项,然后查看debugger运行时的调用堆栈情况,可以看到,除了有inner,outer以外,还有一个scope1.html()这么一个函数,这个函数从何而来的?

我们再看如下代码:

 


debugger;


可以看到,单独运行debugger的时候,firebug的调用堆栈只有一个scope1.html()这个函数被调用。

我们知道,此时是没有任何自定义的函数被调用的,那么这个函数从何而来的?我们不妨做如下大胆猜测,这是浏览器的js引擎自动生成的,我们所有的代码都运行在一个浏览器预先定义的一个函数里,而在这个函数里声明的变量,就是我们所谓的全局变量。

这样,我们就可以以一种一致的方式,去看待javascript代码:所有的代码都是以函数方式运行的,javascript的变量作用域只有一种,那就是函数的局部作用域。

以上言论纯属个人意见,有不同见解,欢迎拍砖。

ps教程:

1  关于scrope1.html()这个函数,在不同的调试环境下,命名可能不一样,比如ie下就是global script code,chrome下就是anonymous function。

在函数内部,局部变量的优先级比同名的全局变量优先级要高;如果存在与全局变量名称相同的局部变量,或者在函数内部声明了与全局变量同名的参数,那么,该全局变量将不再起作用。如下例子:

<script language="javascript" type="text/javascript">
<!--
 var a = "我是一个全局变量";
 function check()
 {
      var a = "我是一个局部变量";
      document.write(a);
 }
 check();
//-->
</script>
输出:

我是一个局部变量
       虽然在全局作用域中可以不使用var声明变量,但在声明局部变量时,一定要使用var语句。一般情况下,函数并不知道全局作用域中定义了什么变量,也不知道这些变量的作用。如果函数使用的是全局变量,而不是是局部变量,那么就可能改变程序其他部分所依赖的全局变量的值。因此,最好在声明所有变量时都使用var语句。

       javascript没有块级作用域,函数中声明的所有变量无论是在哪里声明的,在整个函数中都有意义。在下面代码中,变量i,j,k作用域相同,在整个函数体中都有意义。看下下面例子:

 

<script language="javascript" type="text/javascript">
<!--
 function check()
 {
         var i = 0;
         if(i == 0)
         {
                var j = 1;
                for(var k = 0;k < 1;k ++)
               {
                      document.write("k在循环体内的值为:" + k + "<br />");
               }
               document.write("k在循环体内的值为:" + k + "<br />");
         }
        document.write("j在if语句外的值为:" + j);
 }
 check();
//-->
</script>
输出:

k在循环体内的值为:0
k在循环体内的值为:1
j在if语句外的值为:1

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 浏览器
, 变量
, 程序
, 代码
堆栈
js变量作用域、js变量的作用域、js中变量的作用域、nodejs 变量作用域、js全局变量作用域,以便于您获取更多的相关知识。

时间: 2024-10-27 19:24:29

js变量的作用域详解的相关文章

关于JS变量和作用域详解_javascript技巧

ECMAScript 变量: 1.基本类型值(简单数据段) 2.引用类型值(可能由过个值构成的对象) → 保存在内存中的对象 ------ 动态属性: 只能给引用型值动态添加新属性,以便将来使用. ------ 复制变量值 : 基本类型值的复制 → 在变量对象上创建一个新值 → 复制给新变量(互不影响) 引用类型值的复制 → 将存储在变量对象中的值复制到新变量分配空间中(复制的是一个指针,指向同一个对象,相互影响) ------ 传递参数: ECMAScript中所有函数的参数都是按值传递 .

Python中的变量和作用域详解_python

作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int bu

js闭包用法实例详解_javascript技巧

本文实例讲述了js闭包用法.分享给大家供大家参考,具体如下: 引言 在公司中需要写一个js脚本来进行网站的统计,实现类似百度统计或者站长统计的功能,在实现的过程中自己感觉写的代码还是可以的,因为之前的js代码都是这些写,但是在组长代码走查的时候却非常的不满意,因为我们在js中写的方法都是全局的方法,因为我们写的东西需要嵌入到别人的界面中,所以这些全局的东西很可能会和别人的东西重名从而引发错误,所以说组长就给我留下一句话:用js闭包包起来. 变量作用域 我们都非常的熟悉变量的作用域就分为:全局变量

AngularJS 作用域详解及示例代码_AngularJS

范围扮演其视图连接控制器的角色一个特殊的JavaScript对象.范围包含了模型数据.在控制器,模型数据通过$scope对象访问. <script> var mainApp = angular.module("mainApp", []); mainApp.controller("shapeController", function($scope) { $scope.message = "In shape controller"; $s

Java中成员方法与成员变量访问权限详解_java

记得在一次面试的笔试题中,有的面试官会要求写出具体的像pullic这些访问限定符的作用域.其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了.  这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新,不废话了,贴代码了. 代码如下: package com.jaovo; /** *_1_ 成员变量访问权限的求证 * public private protected default(默认的权限) *

js正则表达式常用函数详解(续)_正则表达式

正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快.正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回执

js正则表达式常用函数详解(续)

正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

网页js报错问题详解

  打开网页js报错问题详解,具体内容如下所示:  最近时常会碰到网页报错的问题,因为最近图方便,会用到很多现成的js.  报错的解决,第一个就是看,找出错误,直接就是点右下角的,看一下第几行,然后,右键页面,看源代码,因为如果你直接进程序,有很多include的原因,显示的第几行第几行,很难弄清楚,然后,最简单的方法,一个一个js排除,删掉不能用的那个. 另外,如果几个js同时存在,而有1,2个不能正常运行是,改掉几个的名称,因为有的组件了,js的名称会冲突,最多见的就是jquery. 还有个

js正则表达式常用函数详解_正则表达式

一.js正则表达式之replace函数用法: 函数功能:replace函数返回根据正则表达式进行文字替换后的字符串的复制. 函数格式:stringObj.replace(rgExp, replaceText) 参数:字符串stringObj,rgExp正则表达式,replaceText所替换的内容 本模块涉及的内容包括字符串创建,正则表达式隐式创建对象,创建正则表达式,进行replace方法的使用匹配 示例代码: <html> <script language="javascr