javascipt中的作用域与变量

1.JavaScript的变量类型
JavaScript的变量分为基本类型和引用类型.基本数据类型是直接存在栈空间的简单数据段,这种类型直接将值保存在内存的某个位置.引用数据类型存储的是指向实际存储于堆内存中的对象的地址.
JavaScript中的基本数据类型共有五种:Number,Null,Undefined,Boolean和String.需要注意的是,js中的String是基本数据类型.
对于基本类型变量的访问,是按值访问的,而对于引用变量的访问是按引用访问的.
2.动态属性
对于引用数据类型的变量,可以对其添加属性和方法,也可以删除属性和方法,例如:

 代码如下 复制代码

var p = new Object();
 p.name = "张三";
 alert(p.name);//张三

但是对于基本数据类型来说,这样是不允许的,如下:

 代码如下 复制代码

var str = "张三";
 str.age = 20;
 alert(str.age);//undefined

3.复制变量值

对于基本类型的变量,从一个变量向另一个变量复制,实际上是将第一个变量存储的值复制给另一个变量。因此,复制完成之后,对第一个变量进行修改,修改操作不会影响另一个变量的值。例如;

 代码如下 复制代码

var num1 = 1;
 var num2 = num1;
 alert(num2);//1
 num1 = 2;
 alert(num2);//1

但是对于引用数据类型,将一个变量复制给另一个变量,实际上是存储第一个变量所存储的地址拷贝给另一个变量,换句话说,这两个变量之后就指向同一块内存空间。因此,接下来对第一个变量的操作也会影响第二个变量。例如:

 代码如下 复制代码

var p1 = newObject();
 p1.name = "张三";
 p1.age = 20;
 var p2 = p1;
 alert(p2.age);//20
 p1.age = 30;
 alert(p2.age);//30

4.参数传递

JavaScript的参数传递全部是按值传递。也就是说,将函数外部的值复制给函数的参数。对于基本类型来说,和变量的复制是一样的,对于引用数据类型,则如同引用数据类型的复制一样。下面分别举例说明:

 代码如下 复制代码

function inc(num) {
     num += 1;
 }
 var i = 10;
 alert(i);//10
 inc(i);
 alert(i);//10

对于基本类型变量i,将其传递给函数inc,实际上是将其值10传递给函数inc的参数,在函数内部,对其内部的变量进程加1操作,因此不会影响i。

再看下面的代码:

 代码如下 复制代码

function setName(obj) {
     obj.name = "张三";
 }
 var person = newObject();
 setName(person);
 alert(person.name);//张三

将person传递给函数setName,于是将person所指向的堆内存地址传递给函数的参数,因此,参数指向的内存和person指向的内存是同一个地址。因此在函数内部修改该地址指向对象的内容也会反映到person上来。

5.检测变量的类型

检测基本类型,使用typeof运算符即可,例如:

 代码如下 复制代码

var s = "张三";
 var b = true;
 var i = 20;
 var u;
 var n = null;
 var o = new Object();
 alert(typeof s);//string
 alert(typeof b);//boolean
 alert(typeof i); //number
 alert(typeof u); //undefined
 alert(typeof n); //object
 alert(typeof o); //object

但是,在检测引用数据类型方面,typeof并不给力,需要使用instanceof运算符:

1 alert(person instanceof Object);//person是不是Object类型的?

 

6.变量作用域

js的作用域主要有两种:全局作用域和局部作用域。值得一提的是,在js中,没有块级作用于。例如:

 代码如下 复制代码

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

以上面的代码为例,for语句块不存在一个特别的作用域,因此在for循环之外,i依然可以被访问到。同理,对于if-else语句也是这样的。

 代码如下 复制代码

if(true) {
     color = "red";
 }
 alert(color);//red

但是还是有办法临时的增加一种新的作用域,主要体现在try-catch和with语句。

 

时间: 2024-09-04 23:17:00

javascipt中的作用域与变量的相关文章

javascript中的变量作用域以及变量提升详细介绍_javascript技巧

变量作用域"一个变量的作用域表示这个变量存在的上下文.它指定了你可以访问哪些变量以及你是否有权限访问某个变量." 变量作用域分为局部作用域和全局作用域. 局部变量(处于函数级别的作用域)不像其他对面对象的编程语言(比方说C++,Java等等),javascript没有块级作用域(被花括号包围的):当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外,这个我们过几天再写个专题). 函数级别作用域的一个例子

javascript中的作用域和上下文使用简要概述

 下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们,感兴趣的朋友不要错过 javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性.每个函数有不同的变量上下文和作用域.这些概念是javascript中一些强大的设计模式的后盾.然而这也给开发人员带来很大困惑.下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们.    上下文 vs 作用域    首先需要澄清

js中this作用域的问题

问题描述 js中this作用域的问题 function Box(){ function Desk(){ this.name = 'ggg'; } Desk();}var b = new Box();alert(b.name);alert(this.name); 这个里边的执行完之后b.name是undefined而window.name变成了ggg,为什么不是b对象改变了而是改变了window对象的 解决方案 var?myvar?=?'我是win的变量';function?winfun(){al

JavaScript 中词法作用域、闭包与跳出闭包详解

Lexical Scope:词法作用域 functions are executed using the scope chain that was in effect when they were defined 一般来说,在编程语言里我们常见的变量作用域就是词法作用域与动态作用域(Dynamic Scope),绝大部分的编程语言都是使用的词法作用域.词法作用域注重的是所谓的Write-Time,即编程时的上下文,而动态作用域以及常见的this的用法,都是Run-Time,即运行时上下文.词法作

详解JavaScript的AngularJS框架中的作用域与数据绑定_AngularJS

AngularJS 简介AngularJS 是由 Google 发起的一款开源的前端 MVC 脚本框架,既适合做普通 WEB 应用也可以做 SPA(单页面应用,所有的用户操作都在一个页面中完成).与同为 MVC 框架的 Dojo 的定位不同,AngularJS 在功能上更加轻量,而相比于 jQuery,AngularJS 又帮您省去了许多机械的绑定工作.在一些对开发速度要求高,功能模块不需要太丰富的非企业级 WEB 应用上,AngularJS 是一个非常好的选择.AngularJS 最为复杂同时

结合代码图文讲解JavaScript中的作用域与作用域链_基础知识

先上三段说明作用域的代码 //==========例1========== var scope='global'; function fn(){ alert(scope); var scope='local'; alert(scope); } fn(); //输出结果? alert(scope);//输出结果? //===========例2========== var scope='global'; function fn(){ alert(scope); scope='local'; ale

深入浅析JavaScript中的作用域和上下文_javascript技巧

javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性.每个函数有不同的变量上下文和作用域.这些概念是javascript中一些强大的设计模式的后盾.然而这也给开发人员带来很大困惑.下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们. 上下文(Context)和作用域(Scope) 首先需要知道的是,上下文和作用域是两个完全不同的概念.多年来,我发现很多开发者会混淆这两个概念(包括我自己),

javascript中的作用域和上下文使用简要概述_基础知识

javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性.每个函数有不同的变量上下文和作用域.这些概念是javascript中一些强大的设计模式的后盾.然而这也给开发人员带来很大困惑.下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们. 上下文 vs 作用域 首先需要澄清的问题是上下文和作用域是不同的概念.多年来我注意到许多开发者经常将这两个术语混淆,错误的将一个描述为另一个.平心而论,这些术语

javascript中的作用域和闭包详解_javascript技巧

一.JavaScript作用域 JavaScript变量实际上只有两种作用域,全局变量和函数的内部变量.在函数内部任何一个地方定义的变量(var scope)其作用域都是整个函数体. 全局变量:指的是window对象下的对象属性. 作用域划分:基于上下文,以函数进行划分的,而不是由块划分的. 强调两点: 1. 在同一作用域中,JavaScript是允许变量的重复定义,并且后一个定义将覆盖前一个定义. 2. 函数内部如果不加关键字var而定义的变量,默认为全局变量. var scope="glob