笔记16.11.26

必须注意的是,注释一定要精确的描述代码。没有用的注释比没有注释更加糟糕。
建议避免使用/* */注释,而使用//代替。这是因为 类似:

/*
  var rm = /a*/.match(s);
*/

的代码会导致一个语法错误。

标识符从一个字母开头,后面可选择性的加上一个或多个字母、数字和下划线。不能使用保留字。
在JS中,只有一个单一的数字类型。在内部用64位浮点数表示。所以1和1.0是相同的值。
同样,Js中字符串可以包含1个或者多个字符。\(反斜杠)是转义字符、所有的字符都是16位的(基于Unicod)
字符串是不可改变的。一旦字符串被建立,就永远无法改变他。可以通过+运算去连接其他的字符串
从而得到一个新的字符串。

代码块是包含在一对花括号中的一组语句。Js的代码块不会创建一个新的作用域。因此,变量应该被定义在函数的
顶端,而不是在代码块中。

除 false、null undefined ” 0 NaN 以外的所有数值都被当做真,包括TRUE、字符串‘false’,以及所有对象

for in 用来枚举一个对象的所有属性名。在每次循环中, for 和 in 中间的变量会被一个属性名的字符串赋值。
但是通常还需要检测该属性名是否是检测对象的自有属性:
for (myvar in obj){
if (obj.hasOwnProperty(myvar)) {}
}

try语句执行一个代码块,并捕获该代码块抛出的异常。catch从句定义了一个新的变量,他将接收该异常对象。
throw则是抛出一个异常,如果throw在try的代码块中,那么当throw触发时,控制器会跳转至catch从句。
如果throw在函数中,则该函数调用立即停止,跳转至该函数的try语句的catch中。

检索时优先考虑使用 . 表示法,因为他紧凑且可读性好。

||运算可以用来填充默认值:
var middle = stooge[“middle-name”] || “(none)”;

对象通过引用来传递,但他们永远不会被拷贝:
var x = stooge;
x.nickname = ‘Curly’;
var nick = stooge.nickname;
// nick == ‘Curly’ 这是因为x和stooge引用的是同一个对象。

原型:
当你创建一个新对象时,你可以选择某个对象作为它的原型。Js提供实现机制杂乱且复杂,但可以简化:
我们将给Object增加一个beget方法:

if (typeof Object.beget !== 'function'){  //如果Objective.beget方法不存在则创建一个方法
  Object.beget = function(o) { //该方法调用一个对象o  
    var F = function(){}; //定义F为一个空的新函数 且将f定义为o的原型
    F.prototype = o;
    return new F();  返回一个以F为构造函数的新函数
  };
}

枚举:
for in 语句可以用来遍历一个对象的所有属性名。该枚举过程将会列举出所有的属性(包括从原型继承的属性和函数)
所以必须过滤:

var name;
for (name in another_stooge){
  if (typeof another_stooge[name] !== 'function') {
    document.writeln(name + ':' + another_stooge[name]);
  }
}

但是,属性名出现的顺序是不确定的,因此要对任何可能出线的顺序有所准备。
如果要以确定的顺序出现,则最好是避免使用 for in 语句 而是:

var i;
var properties = [
  'first-name',
  'middle-name',
  'last-name',
  'profession',
];
for (i = 0;i < properties.length;i +=1;) {
  document.writeln(properties[i] + ':' +
    another_stooge[properties[i]]);
}

减少全局变量的污染:
Js中可以随意的定义那些可以保存所有应用资源的全局变量。但是全局变量削弱了程序的灵活性,应该尽量避免

最小化使用全局变量的方法是只使用一个全局变量:

var myapp = {};
该变量作为你的应用容器:
mappy.stooge = {
  'first-name' : 'Joe',
  'last-name' : 'Howard'
};

mappy.flight = {};

关于this:
方法调用时:

var myObject = {
  value:0;
  increment: function  (inc){
  this.value += typeof inc === 'numbuer' ? inc : 1;
  }
};

此时,increment是myObject的一个方法,方法可以使用this去访问这个对象。可以通过访问对象从对象取值或者修改对象。
通过this取得他们所属对象的上下文的方法。

函数调用:
当函数并非是一个对象的属性时候,调用this将作为函数调用:
此时,this绑定到全局对象。这是一个语言设计的错误。我们可以通过:

myObject.double = function(){
  var that = this;
  var helper = function (){
    that.value = add(that.value,that.value);
  };
  helper();
};

通过给对象增加一个方法,并使用that引用this的方法 让内部函数通过访问局部变量的形式访问对象。

构造器调用:
如果一个函数前使用new 语句来调用,那么将建立一个连接到该函数的prototype成员的新对象,同时this将会绑定到这个新
对象上。同时 new 也会改变return 语句的行为:

var Quo = function (string){
  this.status = string;
};
Quo.prototype.get_status = function (){
  return this.status;
};

var myQuo = new Quo('confused');
document.writeln(myQuo.get_status());

结果令人困惑。因此 不推荐使用构造器函数调用this。

Apply调用:
apply方法可以构建一个参数数组并用其去调用函数。
允许我们选择this的值,它接收2个参数,第一个将是被绑定给this的值,第二个就是参数数组:

var array = [3,4];
var sum = add.apply(null,array);

var statusObject = {
  status: 'A-OK';
};

此时,statusObject并没有继承自Quo.prototype,但是我们可以用statusObject调用get_status方法,
尽管它并没有这个方法。

arguments并不是一个真正的数组,它只是一个arra-like对象。arguments拥有一个length属性,但是它缺少数组方法。
这会导致一些问题。

我们可以通过给Function.prototype 增加方法来使得该方法被所有的函数对象可以用:

Function.prototype.method = function (name,func) {
  this.prototype[name] = func;
  return this;
};

通过给Function.prototype增加一个 method方法,我们就不必键入prototype这个属性名。这个缺点就被掩盖了。
但是,基本类型的原型是公共的结构,所以在类库混用要特别小心:

Function.prototype.method = function(name,func){
  if (!this.prototype[name]){
    this.prototype[name] = func;
  }
};

对于JS而言,最好的做法是在函数体的顶部声明函数中可能用到的变量。

闭包:

var quo = function (status)return {
    get_status: function(){
      return status;
    }
  };
};

var myQuo = quo('amazed');
document.writeln(myQuo.get_status());

另一个例子:

var fade = function (node){
  var level = 1;
  var step = function(){
    var hex = level.toString(16);
    node.style.backgroundColor = '#ffff' + hex + hex;
    if (level < 15){
      level += 1;
      setTimeout(step,100);
    }
  };
  setTimeoout(step,100);
};

fade(document.body);

调用fade,把document.body作为参数传递给他,fade设置level为1.它定义了一个step函数;接着调用setTimeout,并
传递step函数和一个时间给他,然后返回,fade结束。
在100ms后,step被调用。他吧fade函数的level变量转化为16位的字符。接着,它修改fade函数得到的节点颜色。然后
查看fade函数的level变量,如果背景还没变成白色,那么增大fade的level和用setTime函数再次调用自己。eet/stackedit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值