js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量、作用域

javascript按照ECMA-262 的定义,变量与其他语言变量有所不同。js变量时松散的,不需要事先定义变量类型的。这使得他只是一个保存特定值的一个名称。变量与其数据类型可以在脚本的生命周期内改变。

还有明白几点:

JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域。

基本类型和引用类型的值

ECMAScript 的变量有两种不同的数据类型;分别是 基本数据类型值 和 引用类型值 :

基本数据类型值

是指简单的数据段,

如 string number boolean undefined null 等都是简单是数据类型

引用类型值

是指由多个值构成的对象

object 是引用数据类型

动态的属性

定义基本类型的值和引用类型的值方式是类似的。创建一个变量并未变量赋值,但是赋了不同类型值之后,这个变量的意义就发生了巨大的变化。如:

var str = ‘hello‘;//自动形成String类型
var obj = new Object();//Object 类型

定义了两个类型的变量。一个是简单类型的,一个是object类型的值。当你进行以下操作时:

str.name = ‘kin‘;
obj.name = ‘kin‘;
alert(str.name);//undefined
alert(obj.name);//kin

通过给刚定义的变量添加属性。给string 类型的变量添加属性时并没有发生错误。但是访问是确实是未定义的状态。而引用类型的正常访问。这说明了只能够给引用类型的变量添加动态的属性。

关于变量声明

js声明变量有两个方法;一种是隐式声明,显式声明

var str = ‘hello‘;//显式声明
hid = ‘hello‘;//隐式声明

在外围作用域中,使用var关键字声明的显式变量被js引擎认为是全局变量。而在函数内使用var 定义的显式变量被认为是函数的局部变量。

事实上使用var定义的变量都是局部变量,在乎于作用域的问题。在外围作用域,被视为全局变量。在函数作用域 被视为局部变量。

当你访问一个没有赋值的变量是  js会报错,但是你给一个没有定义的变量赋值:

hid = ‘hello‘;

js会认为你在进行隐式声明一个变量。

隐式和显式定义变量会有什么不同呢?

显式定义后的变量不能够操作delect  如:

var str = ‘hello‘;
hid = ‘hi‘;
alert(delete str);//false
alert(delete hid);//true
alert(str);//hello
alert(hid);//undefined

全局变量和局部变量

在js解析器开始执行时,会在执行环境里建一个全局对象。在全局对象里面所定义的变量都是全局变量。因此,在顶层的代码里我们可以使用this window 等对象去访问这些变量:

var str = ‘string‘;
alert(this.str);//string
alert(window.str);//string
function fun(){
alert(window.str);//string
alert(this.str);//string
}
fun();

使用this  和 window 关键字可以对全局变量进行访问。可以直接访问

var Num = 100;//定义全局变量
function R_Num(){
alert(Num);//在函数作用域中访问全局变量
}
R_Num();

复制变量

在js中  如果你要复制变量。非常简单如:

var  str = ‘string’;
var  str1 = str;//此时 str1 等到了和str 一样的值;

在str 中保存的是字符串 string  定义str1 时使用str 来初始化。因此,str1 中也保存了str 相同的值。而str1 中的值是完全独立的,换句话说  就算你把str 删除 对str1 是没有任何影响的。可以说str1 是str 的一个副本。

例图:

标示符
str string

复制之后:开辟了一块新的空间保存str1

标示符
str string
str1 string

复制引用类型的变量。实质上是复制引用类型的指针。如

var  obj = new  Object(); 
var  obj2 = obj;

他们指向同一个引用类型。

传递参数

前面说道 js中传递到函数去的值都是保存的一个arguments 对象中去的。 所以,当有传递变量时同样涉及到把一个变量赋值到另外一个变量中去,如:

var num = 100;
function addTen(num){
return num = num+100;//函数中改变了num变量。
}
alert(addTen(num));//200
alert(num);//100

在函数内将num值改变了。

但是当回到外围作用域使用alert(num)时值依然是原来的值没有变化。说明当传递参数给函数时参数只是将num 复制传递到函数体内  函数中使用的只是外围作用域中num的副本。所以,在函数内部num改变都不会影响到函数外的num。

当传递的值是引用类型时。

如:

var obj = {
name:‘kin‘,
age:‘20‘
};
function changeName(obj){
return obj.name = ‘chen‘;
}
var newName = changeName(obj);
alert(newName);//chen
alert(obj.name);//chen

引用类型的值完全发生了变化  外围作用域中obj 的 name属性从原本的kin 改变成了chen 原因是传递给函数的值是这个引用类型的指针,函数根据这个指针改变了相应的obj属性。因此,obj的属性从根本上被改变了。

js基础--javascript基础概念之变量与作用域,布布扣,bubuko.com

时间: 2024-08-01 23:03:00

js基础--javascript基础概念之变量与作用域的相关文章

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之语句(二)

js基础--javascript基础概念之语句(二)label,break,continue.. break .  continue 语句. break  continue 语句用于在循环中精确控制代码的执行,其中break语句会立即退出循环,执行循环后面的语句. continue 则退出循环后返回到再次进入循环中. 如: var num = 0; for(var i = 0; i<=100; i++){ if(i >= 10){ break; } num = i; } alert(num);

js基础--javascript基础概念之语句

js基础--javascript基础概念之语句 ECMA-262定义了一组语句(流程控制语句) 语句定义了EMCAScript 语法. 常见的if语句. 语法: if(condition) statement1 else statement2 其中.Condition 可以是任意表达式.而且对这个表达式求值的结果不一定是布尔值.因为script 会自动调用boolean 将值转换为布尔值.如果condition 的值是 true .则执行statement1 语句  否则  执行 stateme

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];

javascript学习日记之变量的作用域

``` 很显然第一个弹出框并没有如我所想弹出的global而是undefined 这是为什么呢? 其实由于函数作用域特性 函数域始终优于全局域 同名的局部变量会覆盖掉全局变量 而第一次调用alert的时候scope还没正式定义 所以为undefined 以上代码可以理解为: ``` function f(){ var scope; alert(scope); var scope ="local"; alert(scope); }; f(); //等价与函数内变量的声明'提前'至函数体顶

JavaScript学习笔记—— 4. 变量、作用域和内存问题

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值,其中基本类型值是简单的数据段,而引用类型值指的是那些可能由多个值构成的对象: 对于5种基本类型数据:undefined, null,boolean,number和string,采用按值访问,因为可以操作保存在变量中的实际的值: 对于引用类型的值而言,JavaScript并不能直接访问内存中的位置,也就是说不能直接操作对象的内存空间,在操作对象时,实际上是在操作对象的引用而非实际的对象. 在从一个变量向另一个变量复制基本

前段基础----JavaScript基础

一.JavaScript概述 1,JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript 微软随后模仿在其IE3.0的产品中搭

JavaScript基本概念(变量和数据类型)

1. 变量 在局部作用域中省略var操作符可以定义全局变量,但是这么做会导致该变量难以维护,且在严格模式下会导致抛出ReferenceError错误. 2. 数据类型(js共用6种数据类型,分别是 Undefined,Null,Boolean,Number,String,Object) 2.1 typeof操作符 对一个值使用typeof操作符可能会返回下列某个字符串: □ "undefined" ---如果这个值未定义或者未初始化: □ "boolean" ---