我具有如我加載僱員部及其腳本作爲index.html的一部分javascript如何檢測函數的定義,頂部/底部?
的index.html Working Demo
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="style.css" />
<script data-require="jquery" data-semver="2.1.3" src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<h1>Employee Details loaded as usual and sript is executing able to see alert</h1>
</body>
</html>
的script.js
var empModule = (function (empModule) {
var Years = null;
$(document).ready(function() {
var empdata = { Name: 'Billa' }
var myVM = new empModule.viewModel(empdata);
});
empModule.viewModel = function (data) {
var that = this;
that.Name = data.Name;
alert(that.Name);
};
return {
empModule: empModule
}
} (empModule || {}));
以下代碼工作只要
錯誤情景:
我們決定移動員工r高興的部分基於某種條件。因此,我們通過Ajax加載這個部分和部分相關的腳本(emp.js)。但現在它拋出錯誤empModule.viewModel is not a constructor
。爲什麼這樣?
如果我在移動像以下順序底部的document.ready部,它是工作
Emp.js(從移動的script.js通過AJAX到emp.js和負載(
var empModule = (function (empModule) {
var Years = null;
// Code not working when we load this script file using Ajax.
// But works if we move this document.ready at bottom
//$(document).ready(function() {
// var empdata = { Name: 'Billa' }
// var myVM = new empModule.viewModel(empdata);
//});
empModule.viewModel = function (data) {
var that = this;
that.Name = data.Name;
alert(that.Name);
};
//Working only if I keep the ready section here
$(document).ready(function() {
var empdata = { Name: 'Billa' }
var myVM = new empModule.viewModel(empdata);
});
return {
empModule: empModule
}
} (empModule || {}));
功能empModule,因爲它是自 執行功能將得到自動執行。當執行它需要準備 empModule.viewModel對象,但未能這樣做,當視圖模型 定義位於document.ready(調用者)之後。這種情況僅 當我加載通過Ajax這個腳本,但如果我預先在一個頁面
你能告訴你是如何加入腳本?你什麼時候期待使用它?例如'$(document).ready(// call module emp)'? – Matho
@Matho,函數'empModule'將自動執行,因爲它是自執行函數。當它正在執行時,它需要準備一個empModule.viewModel對象,但是當viewModel定義位於document.ready(caller) – Billa
閱讀關於[function hosting](http://adripofjavascript.com/blog/drips /variable-and-function-hoisting.html) –