怎么实现把方法存成变量 执行的时候 this 还不乱跳?~

define(function () {
    var fn;
    
    function setHeight(obj) {
        fn = $(obj).height; // jQuery 的 height() 方法
        
        fn(); // 如果这么调用的话 this 就指向了全局
    }
    
    function reduction() {
        fn(); // 如果这么调用的话 this 就指向了全局
    }
    
    return {
        init: setHeight
    };
});

存成变量 调用时是在全局环境 this 默认指向 window 然而这并不是我想要的~

js 的 this 问题没少被吐槽 这是语言的设计问题吗 在别的语言上有这样的特征吗?~

clipboard.png

我怎么做到把 $(obj) 这个对象上的 height 方法存起来 这样的话如果后续要把 height 方法修改成 outerHeight 直接改一处就可以了 而且也不用每次去查对象原型链上的 height 了 对于这种重复用在好多地方的东西大家都是怎么处理的~

阅读 3.5k
5 个回答

可以这样

fn = function(){
    return $(obj).height();
}

或者这样
fn = $(obj).height.bind($(obj));

兄弟,你对this的了解太少了,你看的这个资料,怎么说呢,误人子弟吧。
给你推荐一篇我的文章,读懂了回过头来思考你的问题,就会发现不是问题了。

前端基础进阶:全方位解读this

一种简单的方式来解决你的问题。

var $obj = $(obj);
fn = $obj.height.bind($obj);

更好的方式是改变你的模块设计,你的模块应该是一个类,然后通过 new xxx(obj)来创建对象。

你的 fn 可以返回 this.height()。这样调用的时候,不论是$(object),还是啥别的东西,永远都是得到调用者的 .height()

首先来说,javascript的设计并没有问题。比如以下代码:

Foo.method = function() {
  console.log(this);

  function test() {
    console.log(this);
  }
}

非use strict模式下

第一个console的this指向的是它function对应的对象Foo,输出的当然是Foo这并没有错。第二个console的this指向的还是它的function,只不过这回不是Foo而是test的基对象window,相当于:

window.test = function() {
    console.log(this);
}

输出的内容当然是window毋庸置疑。

比如你上面贴的代码, var fn 为一个function,相当于在window上临时创建一个fn变量,fn里面的this当然会指向window没有任何异议。

总的来说,吐槽this的都是因为这个东西没有实质的理解。多看看书吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题