JavaScript的两个特征:
?
- 不需要声明就可以使用变量
- 有隐含的全局概念,即不声明的任何变量都会成为全局对象(this)的属性
function sum(x, y) { // 不推荐写法: 隐式全局变量 result = x + y; return result; } alert("sum="+sum(3,3) + " result="+result); // 结果:sum=6 result=6 // 说明:如果不调用sum函数,直接运行alert(result),结果就是 result 未定义, 因此、尽量使用var声明变量.
? ??
? ? *使用任务链进行部分var声明
function sum() { var a = b = 0; // a 是局部变量、b是全局变量 }
? ??此现象发生的原因在于这个从右到左的赋值,首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。
? ? ??
? ?
? ? ?隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。
- 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
- 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
? ? ?这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删 除的,而变量是不能的:
// 定义三个全局变量 var global_var = 1; global_novar = 2; // 反面教材 (function () { global_fromfunc = 3; // 反面教材 }()); // 试图删除 delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // 测试该删除 typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined"?
JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。看下面这个例子:
range = "global"; // 全局变量 function show() { alert(range ); // "undefined" var range = "local"; alert(range ); // "local" } show();?
在coding中,编码规范非常重要,可以让自己和团队其他成员更易阅读和理解。
- 缩进
- 空格
- 分号
- 变量定义(个人偏好 ?各单词用下划线分隔)
- 方法定义(公有和私有应区分)
- 常量定义(个人偏好 全部大写)
- 注释
努力编写高质量的javascript代码!
javascript对象字面量
? ?javascript允许使用一种简洁而可读的记法来创建数组和对象.
?
var customer = new Object(); customer.firstName="yongfei"; customer.lastName="yang";
?? 等价于:
? ?var customer={firstName:'yongfei',lastName:'yang'}
?
对象字面量(object literal):一个名值对列表,每个名值对之间用逗号分隔,并用一个大括号括起。各名值对表示对象的一个属性,名和值这两部分之间用一个冒号分隔。
数组字面量(array literal):这是一个用逗号分隔的值列表
函数字面量:前面是一个function关键字,后面是一个函数名(可选)和参数表。然后是函数体,包围在大括号中。
?
?
? ? ?prototype使用技巧
- JavaScript为每一个类型(Type)都提供了一个prototype属性,将这个属性指向一个对象,这个对象就成为了这个类型的“原型”,这意味着由这个类型所创建的所有对象都具有这个原型的特性。另外,JavaScript的对象是动态的,原型也不例外,给prototype增加或者减少属性,将改变这个类型的原型,这种改变将直接作用到由这个原型创建的所有对象上.
- 如果给某个对象的类型的原型添加了某个名为a的属性,而这个对象本身又有一个名为a的同名属性,则在访问这个对象的属性a时,对象本身的属性“覆盖”了原型属性,但是原型属性并没有消失,当你用delete运算符将对象本身的属性a删除时,对象的原型属性就恢复了可见性。利用这个特性,可以为对象的属性设定默认值
- 将一个对象设置为一个类型的原型,相当于通过实例化这个类型,为对象建立只读副本,在任何时候对副本进行改变,都不会影响到原始对象,而对原始对象进行改变,则会影响到副本,除非被改变的属性已经被副本自己的同名属性覆盖。用delete操作将对象自己的同名属性删除,则可以恢复原型属性的可见性。
?
?
?