Skip to content
LYF edited this page Jul 28, 2016 · 40 revisions

###一、闭包闭住公共变量

var ZingTouch = {
    _region:[], // 公共变量
    Region: function(){
        var id = ZingTouch._region.length;
        console.log(id);
        ZingTouch._region.push(obj);
    }
}

var region = new ZingTouch.Region(); // 0
var region2 = new ZingTouch.Region();// 1
var region3 = new ZingTouch.Region();// 2

https://github.com/zingchart/zingtouch/blob/master/src/ZingTouch.js

###二、不知道作用

var Trigger = function(_element) {
  this.element = _element;
  this.left = function(_this){
     return function(){
       return _this.element.left
     }  
  }(this)
}

https://github.com/terwanerik/ScrollTrigger/blob/master/ScrollTrigger.js

###三、定义私有变量

var Trigger = function(_element){
   this.element = _element;
   var xoffset = 0; // 私有变量
   var yoffset = 0; // 私有变量
}

https://github.com/terwanerik/ScrollTrigger/blob/master/ScrollTrigger.js

###四、看avalon源码,很屌的写法

// 惰性函数
function CSPHack(array){
     var a = array.reverse().join("")
     return function(v){
         return window[a].apply(0, v)
     }
     return window
 }
 var CSPcompile = CSPHack(["n","o","i","t","c","n","u", "F"])

 // 类似于
 // var f = Function.apply(0,['a','b','return a + b'])
 // f(2, 3); // 5
 function CSPcompile(array){
     return Object.constructor.apply(0,array)
}

// 一个小技巧。由于与this相关,js引擎总能保证this是一个引用值,所以用call/apply方法时,context随便,第一个参数可写成0,比写成null要好

五、jquery free写法

var $ = document.querySelectAll.bind(document);

六、取整的另一种方法

var a = 12.3;
a |= 0;
console.log(a); // 12

a = -9.512;
a |= 0;
console.log(a); // -9

七、稀疏数组处理

var arr = Array(10); // [undefined × 10]
 
arr[3] = 999;

arr[8] = void 0;

for(var i = 0, n = arr.length; i < n; i++){

   if( i in arr ){
 
      console.log(arr[i]); // 999, undefined

   }  

}

八、判断环境是否是ES5+

var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

bluebird中看到这种写法

九、bluebird

var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    // 记住这个技巧:在try中进行运算,若发生了异常,在catch中返回
    // 这样就在不支持或有问题的环境中,也能返回想要的结果
    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };
    
    // 记住这个技巧。catch中return
    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

十、全局变量获取

顺序是:self -> window -> global -> this -> null

var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

十一、defineProperty

var obj = {b: 2};

Object.defineProperty(obj, 'a', {
  enumerable: true,
  configurable: true,
  get: function(){
    console.log(this); // {b: 2}
    return 999;
  },
  set: function(v){
    console.log(this); //{b: 2}
    this.a = v; // 不能这样干,会栈溢出的
  }
})
Clone this wiki locally