zoukankan      html  css  js  c++  java
  • javascript高级知识点——指定上下文实现

    代码信息来自于http://ejohn.org/apps/learn/。

    当我们将一个对象的点击事件绑定到一个事件触发元素时会发生什么?

    <ul id="results">
    </ul>
    <script>
    var Button = { 
      click: function(){ 
        this.clicked = true; 
      } 
    }; 
     
    var elem = document.createElement("li"); 
    elem.innerHTML = "Click me!"; 
    elem.onclick = Button.click; 
    document.getElementById("results").appendChild(elem); 
     
    elem.onclick(); 
    console.log( elem.clicked, "clicked属性被设置在点击的元素上面了" );
    </script>

    因为elem.onclick(),调用onclick时,this指向调用它的对象,也就是elem,所以发生错误。

    我们需要固定上下文为原先的对象

    function bind(context, name){ 
      return function(){ 
        return context[name].apply(context, arguments); 
      }; 
    } 
     
    var Button = { 
      click: function(){ 
        this.clicked = true; 
      } 
    }; 
     
    var elem = document.createElement("li"); 
    elem.innerHTML = "Click me!"; 
    elem.onclick = bind(Button, "click"); 
    document.getElementById("results").appendChild(elem); 
     
    elem.onclick(); 
    console.log( Button.clicked, "点击属性被设置在了原先的对象上面" );

    修改方法以适应所有的函数

    Function.prototype.bind = function(object){ 
      var fn = this; 
      return function(){ 
        return fn.apply(object, arguments); 
      }; 
    }; 
     
    var Button = { 
      click: function(){ 
        this.clicked = true; 
      } 
    }; 
     
    var elem = document.createElement("li"); 
    elem.innerHTML = "Click me!"; 
    elem.onclick = Button.click.bind(Button); 
    document.getElementById("results").appendChild(elem); 
     
    elem.onclick(); 
    console.log( Button.clicked, "点击属性被设置在原先对象上面" );

    最终目标,考虑到带参数的函数

    Function.prototype.bind = function(){ 
      var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 
      return function(){ 
        return fn.apply(object, 
          args.concat(Array.prototype.slice.call(arguments))); 
      }; 
    }; 
     
    var Button = { 
      click: function(value){ 
        this.clicked = value; 
      } 
    }; 
     
    var elem = document.createElement("li"); 
    elem.innerHTML = "Click me!"; 
    elem.onclick = Button.click.bind(Button, false); 
    document.getElementById("results").appendChild(elem); 
     
    elem.onclick(); 
    console.log( Button.clicked === false, "属性被设置在原先对象上面" )
  • 相关阅读:
    iOS:CALayer锚点的使用
    iOS:UIView的CALayer基本演练
    iOS:iOS中的几种动画
    iOS:CALayer核心动画层
    Objective-C:KVO机制
    Objective-C:KVC机制
    投资方式集汇
    曝光卖假币的店铺和旺旺ID
    android 的开源输入法介绍,及 自动触摸的实现方法
    Intra Refresh of H264 encoder
  • 原文地址:https://www.cnblogs.com/winderby/p/4074319.html
Copyright © 2011-2022 走看看