我正在客户端开发一个表导出插件。插件工作正常。但是当我在jshint中验证我的代码时,它会抛出一个错误,指出可能存在严格的违规行为。以下是功能:
function disableExport(){
if(_(this).exportPlugin !== undefined){
_(this).exportPlugin.setStyle('pointer-events', 'none');
_(this).exportPlugin.find('.ebIcon').removeModifier('interactive','ebIcon');
_(this).exportPlugin.find('.ebIcon').setModifier('disabled','','ebIcon');
}else{
console.log('ERROR!');
}
}
它说:“如果使用函数调用执行严格模式函数,则其'this'值将是未定义的。”
https://jsfiddle.net/t47L8yyr/
上提供了完整的插件代码 如何解决此问题?除使用/*jshint validthis:true*/
答案 0 :(得分:5)
在disableExport()
功能中,您引用了this
。如果你正常调用函数......
disableExport()
...在strict
Javascript mode中,this
将是未定义的。在严格模式之外,this
通常是window
对象。所以:
disableExport() // `this` will be `window`
"use strict"
disableExport() // `this` will be undefined
这不好。如果要定位window
对象,请明确使用它:
_(window).exportPlugin(...) // reference `window`, not `this`
如果您尝试使用this
作为函数的参数,请调用它
使用Function.call()
或Function.apply()
时,最好采取实际操作
参数比使用this
:
function disableExport(target) {
if(_(target).exportPlugin !== undefined) {
// ...
}
}
然后,您可以拨打disableExport(window)
或任何其他target
。这通常是
最好只在处理定义的对象的方法时使用this
在函数的prototype
中,或通过ES6 class
syntax。