我对JS行为很困惑,实际上在CoffeScript,Este-library,Google-closure和React中开发大型应用程序。如果不知道的话,我可以分享更多的信息或代码。
这种“非投掷”行为开始,当组件(goog.ui.Component)不能通过装饰时,在React中调用not exists func或者如果我简单地删除Google Analytic init代码 - >变量窗口['ga']不存在但是窗口['ga']。someFunc()不会抛出任何错误。这不是1:1代码。
Component = function() { }
Component.prototype.match_ = null;
Component.prototype.show = function() {
'use strict';
console.log(this.match_);
this.match_.functionDoesntExist();
}
这样的流程代码:
var component = new Component();
component.show();
输出如下:
null
如果我替换“Component.prototype.show”:
// ...
Component.prototype.show = function() {
'use strict';
try {
console.log(this.match_);
this.match_.functionDoesntExist();
} catch (error) {
console.log("Error detected!", error);
}
}
它会触发错误并正确显示:
"Error detected! TypeError: Cannot read property 'functionDoesntExist' of null(…)"
以下是Google Analytic示例,代码为1:1。
goog.provide('core.Analytics');
goog.require('goog.Uri');
/**
@constructor
*/
core.Analytics = function() {
this.ga_ = window['ga'];
return;
}
goog.addSingletonGetter(core.Analytics);
/**
@private
*/
core.Analytics.prototype.ga_ = null;
/**
@public
*/
core.Analytics.prototype.sendPageView = function() {
var page;
page = this.getCurrentPage_();
this.ga_('send', {
'page': page
});
};
/**
@private
@return {string}
*/
core.Analytics.prototype.getCurrentPage_ = function() {
var page, uri;
uri = new goog.Uri(window['location']['href']);
page = uri.getPath();
if (uri.hasQuery()) {
page += '?' + uri.getQuery();
}
if (uri.hasFragment()) {
page += '#' + uri.getFragment();
}
return page;
};
以及其他一些文件:
goog.require('core.Analytics');
core.Analytics.getInstance().sendPageView();
PS:抱歉不好(: