首页 > 代码库 > JavaScript学习笔记【二】
JavaScript学习笔记【二】
JavaScript的变量、作用域
一、JavaScript的数据类型分为基本数据类型和引用数据类型、
1.基本数据类型分别包括Null、Undefined、Number、Boolean和String类型、这五种基本数据类型可以通过typeof方法来判定、
alert(typeof a);其结果分别为‘null‘、‘undefined‘、‘number‘、‘boolean‘、‘string‘、基本类型的赋值是值得传递、例:当把一个变量a的值传递给另外一个变量b时、
这两个变量a、b就分别有了自己的值、a的操作不会影响到b的值、反之亦然、
2.引用数据类型、
a.数组、对象等都是引用数据类型、引用数据类型可以添加属性、而基本数据类型却不可以(虽然给基本数据类型添加属性时并没有报错、但却取不到属性的值)、
var person = new Object;
person.name = ‘John‘;
alert(person.name); //结果为‘John‘;
b.引用数据类型的判定不能使用typeof方法、应该借用instanceof方法、
var arr = new Array();
alert(arr instanceof Array); // 判定arr是否Arry的一个实例、是则返回true、不是则返回false、此处返回true、
任何引用数据类型使用 obj instanceof Object时都返回true、因为Object是suoyou类的基类、
c.引用数据类型进行赋值时是引用的传递、而不是值得传递、例:当把一个引用类型的变量a赋值给b时、只是把引用复制给了b、而a和b指向内存中的同一个对象、
a的改变必将引起b的改变、反之亦然、
var a = new Object();
a.name = ‘John‘;
var b = a;
b.name = ‘Smith‘;
alert(a.name); //由于变量a和b的引用都指向了同一个内存中的对象、因此b改变的时候、a的值也发生改变、因此此处弹出‘Smith‘;
3.函数中参数的传递、
在【JavaScript高级程序设计】一书中、说函数的参数传递、都是值的传递(基本数据类型和引用数据类型在作为参数传递时都是值得传递)、
举了这样的一个例子、
function setName(obj) {
obj.name = ‘Smith‘;
obj = new Object();
obj.name = ‘XiaoYang‘;
}
var person = new Object();
person.name = ‘John‘;
setName(person);
alert(person.name); //结果为Smith;【JavaScript高级程序设计】这样解释、如果person是按引用传递的、那么在obj.name = ‘XiaoYang‘;
赋值的时候此处person.name的值就应该变为‘XiaoYang‘了、而结果却为‘Smith‘、<而我个人的理解是在setName中作obj=new Object()时就已经改变了参数obj的引用、
而引用既然已经改变了、obj值的变化就不会影响到外部person变量的值了、>
var person = new Object();
person.name = ‘John‘;
var obj = person; //此处obj和person的引用指向同一对象、
obj = new Object();
ob.name = ‘Smith‘;
alert(person.name); //结果为‘John‘;如果参照【JavaScript高级程序设计】(参数传递为值传递、非参数传递为引用传递)此处的值应该为‘Smith‘、而实际值却为‘John‘、
因为obj=new Object()改变了obj之前的引用、和person已经指向了不同的对象、因此obj值的改变不会影响到person的值、
二、变量作用域、
1.JavaScript的变量作用域和Java有点不同、在JavaScript中、每个函数都有一个执行环境、全局执行环境是最外层的一个执行环境、
而JavaScript的代码又是自上而下顺序执行、因此如下代码如果没有定义到指定的函数中、那么它的执行环境就是全局执行环境、所有的变量和函数都是定义在window上的、
if(true) { var num == 11;} alert(num); // 结果为11、同alert(window.num);
2.在函数内部、变量的作用域不能超过该函数、但内部函数可以访问它的上一层函数的变量、
var num == 9;
function add() {
var a = num + 1; /此处可以访问外层的num、
var b = 1 + c; //此处会抛出异常、因为在执行环境add中、没有变量c
function plus() {
var c = a + b;/此处可以访问外层的a和b、
}
}
JavaScript在使用到变量时、首先在本执行环境中查询、如果查询不到再到上一层环境中查询、一直到最外层的执行环境、但是不会内部的执行环境中去查询、
3.延长变量作用域、with和catch语句
function add() {
var qs = ‘?debug=true‘;
with(location) {
var url = href + qs;
}
return url; // 此处url越过了with语句、在with语句外部也可以访问、
}
【javaScript高级程序设计】中说、catch语句捕获的错误会被添加到执行环境的变量对象中、而不是catch语句的变量对象中、因此在catch语句外部也可以访问错误对象、
如下代码、在Chrome中却发现、在catch外部无法访问err对象
function add() {
try {
var a = b + 1;
return a;
} catch(err) {
console.log(err.message);
}
console.log(‘[‘ + err.message + ‘]‘); //此处无法访问err对象、
};
add();
JavaScript学习笔记【二】