0
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 问题没少被吐槽 这是语言的设计问题吗 在别的语言上有这样的特征吗?~

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

5个回答

4

可以这样

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

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

+1

这里是方法的bind,属于原生js的

UKer · 2月17日

展开评论
3

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

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

2

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

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

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

1

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

0

首先来说,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的都是因为这个东西没有实质的理解。多看看书吧

撰写答案

SegmentFault

一起探索更多未知

下载 App