JS中立即执行函数中的this指向window啊?求大佬解惑,谢谢

新手上路,请多包涵

我想要产生一个随机数,下面的这个程序是可以的,我想为什么要用原型对象prototype添加getRandom方法呢?用this就不可以。(我查到说this指向的是window,这点不太理解,那自定义构造函数创建对象中的this也是指向window呢?)

   (function (window) {
        function Random() {
        }
        Random.prototype.getRandom=function (min,max) {
            return Math.floor(Math.random()*(max-min)+min);
        };
        //把局部对象暴露给window顶级对象,就成了全局的对象
        window.Random=new Random();
    })(window);//自调用构造函数的方式,分号一定要加上
    
    console.log(Random.getRandom(1,5));

改成this之后就不可以产生随机数。

    (function (window) {
        function Random() {
            this.getRandom = function (min,max) {
                return Math.floor(Math.random()*(max-min)+min);
            };
        window.Random = new Random();
        })(window);
    console.log(Random.getRandom(1,5));
阅读 4.6k
4 个回答

改成this之后不可以产生随机数?是语法错误吧,少写了一个}


两种方式的区别:

  • 方式1: getRandom方法是在Random的原型链上的
    image.png
  • 方法2:getRandom方法是在Random的对象上
    image.png

但是你上面的两种写法,效果是一样的,因为window.Random = new Random()导致window.Random是一个单例对象,换成下面的写法也可以:

window.Random = {
   getRandom: function() {
       return Math.floor(Math.random()*(max-min)+min);
   }, 
};

想要访问函数中所定义的属性或函数,还有少了一个},以及实例化那行代码要放到自定义函数内部,改成如下即可:

(function (window) {
      function Random() {
        this.getRandom = function (min, max) {
          return Math.floor(Math.random() * (max - min) + min);
        };
      }
      //另外这里实例化不要放到函数内部中去
      window.Random = new Random();
    })(window);

你都写错了,少了个},而且window.Random = new Random()是在函数里,你也没有在立即执行函数中调用过Random,肯定不会挂在window下啊,正确写法应该是下面这样吧:

(function (window) {
  function Random() {
    this.getRandom = function (min, max) {
      return Math.floor(Math.random() * (max - min) + min);
    };
  }
  window.Random = new Random();
})(window);
console.log(Random.getRandom(1, 5));
新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题