为什么& # 39;这个# 39;指'window'而不是类实例
Why 'this' refers to 'window' instead of a class instance
我有一个包装器函数,我得到全局对象( root = this
),然后我启用严格模式并声明一些函数。
在这个包装器函数中,我有一个类,我正确地调用它(使用 new
操作符)。问题是在我的原型方法中访问该类的实例,因为它引用全局对象,使用 this
。
这是我正在写的代码,我删除了一些不相关的部分,以推动自己的问题。
注意:exports.Timer
是使用_timer
的类。
(function(root, name, factory) {
'use strict'
factory(typeof root['exports'] === 'object' ? module.exports : root[name] = {})
})(this, 'timerEx', function(exports) {
var root = this
'use strict'
/* my class */
function _timer(id, options) {
this.anim = options.anim
this.delay = options.delay
this.exec = typeof (this.fnc = options.callback) === 'function'
this.id = id
}
_timer.prototype = {
'start': function() {
// here's the problem.
// this is equal to 'window'
console.log(this instanceof _timer) // false
this.state = true
if (this.isAnim = (this.anim && typeof requestAnimFrame === 'function')) {
this._then = receiveTime()
animRun(this)
} else timeoutRun(this)
},
'stop': function() {
if (this.state)
(this.isAnim ? cancelAnimFrame : clearTimeout)(this.xId)
this.isAnim = null
this.state = false
}
}
var timers = []
function getReservedTimerId() {
var len = timers.length - 1
if (len <= 0) return 0;
for (var i = 0, reserved; i <= len; ++i) {
if (i === len)
reserved = i + 1
else if ((timers[i].id + 1) < timers[i + 1].id) {
reserved = timers[i].id + 1
break
}
}
return reserved
}
function getTimerById(id) {
var timer
for (var i = 0, len = timers.length; i < len; ++i) {
if (timers[i].id === id) {
timer = timers[i]
break
}
}
return timer
}
exports.Timer = function(options) {
typeof options !== 'object' && (options = {})
for (var i in def_options)
typeof options[i] !== typeof def_options[i] && (options[i] = def_options[i])
var id = getReservedTimerId()
timers.push(new _timer(id, options))
this.__id__ = id
}
exports.Timer.fn = exports.Timer.prototype = {
'delay': function(rate) {
getTimerById(this.__id__).delay = rate
},
'toggle': function(state) {
var timer = getTimerById(this.__id__)
timer[(typeof state === 'boolean' ? state : timer.state) ? 'stop' : 'start']()
}
}
})
当你这样做的时候:
(state ? timer.start : timer.stop)()
然后是表达式计时器。Start 返回一个函数,然后在没有基对象的情况下调用该函数,因此它的this在调用中未定义,因此在函数中,它默认为全局对象。它相当于:
var a = timer.start;
a();
function Foo(){};
Foo.prototype.start = function(){
return this instanceof Foo;
}
var a = new Foo();
console.log('Normal call: ' + a.start());
console.log('Conditional call: ' + (true? a.start : null)());
相关文章:
- ES6构造函数返回基类的实例
- 我应该如何用javascript实例化这个日期
- "Cookies的这个实例“;在nodejs cookie中间件的源代码中
- 什么是“这个fNOP实例?这“在做
- 有没有更优雅的方法来实例化这个Map
- "这个“;javascript中的关键字(作为实例)
- 不知道如何在这个特定的实例中处理javascript和mechanize
- 为什么这个属性在一个实例中打印,而不是在类似的实例中打印,即使它在两个实例中都是可枚举的
- 如何销毁这个Backbone.js视图实例?
- Promise内部的这个上下文并没有引用内部实例
- 为什么javascript函数知道这个实例?
- 为什么& # 39;这个# 39;指'window'而不是类实例
- 如何使这个点击实例只发生一次,并可访问的所有内容
- 从方法实例访问这个变量
- 为什么";这个";这些绑定函数的上下文,在每个新实例中都是一样的
- Javascript实例和这个
- 如何制作“这个”?关键字引用当前实例,如果从嵌套对象's方法中使用
- 这个javascript属性是一个实例属性还是一个原型属性?
- backbone.js这个.模型是未定义的葡萄酒应用实例
- 这个内部原型函数等于窗口,而不是对象实例