js方法的声明与调用
具名函數直接調用
function foo() ? { ? } ? foo();?
(2)匿名函數通過引用來調用
fooRef = function() ? { ? } fooRef();?
(3)沒有引用的匿名函數調用1
(function() ?{ }());?
(4)沒有引用的匿名函數調用2
(function() ?{ ?})(); ??
?(5)沒有引用的匿名函數調用3??
void function() ?{?}();
?
圖1.1,圖1.2表明了這兩種表達式的運算過程是不一樣的,圖1.1中是用強制運算符使函數調用運算得以執行,圖1.2中則用強制運算符運算"函數直接量聲明"這個表達式,并返回一個函數自身的引用,然后通過函數調用運算"()"來操作這個函數引用。而上面的最后一個匿名函數調用void function(){}();則用于調用函數并忽略返回值,運算符void用于使其后面的函數表達式執行運算。如果我們不使用"void"與強制運算"()",代碼能否執行:
(1)function(){}() //使用''()"強制調用
(2)function(){}(); //使用";"來執行語句
腳本引擎會認為function(){}是函數聲明,從而通不過語法檢測,代碼被解析成這樣:
function(){};();
function(){}被作為聲明被解釋,而"();"被獨立成一行來解釋,因而會報語法錯誤,為什么知道是"();"導致的錯誤?我們改成如下代碼:
function(){}(1);
這樣就會被引擎解釋為:
fucntion(){};
(1); //單值表達式
因而通過了語法檢測.
- 方法調用模式
- 函數調用模式
- 構造器調用模式
- apply調用模式
下面我們來看看一些實例更好理解。
1:方法調用模式。
請注意this此時指向myobject。
/*方法調用模式*/ ???
var myobject={ ????????
??? value:0, ???????????
inc:function(){ ????????
??????????? alert(this.value) ??????
????????? } ???????
} ???
myobject.inc()
?
2:函數調用模式
請注意this此時指向window
/*函數調用模式*/ ????
??? var add=function(a,b){
??????? alert(this)//this被綁頂到window
??????????? return a+b; ???????
} ??? var sum=add(3,4); ??
? alert(sum)
?
3:構造器調用模式
javascript語言精粹一書建議摒棄這中方式。因為有更好的方式。這里先不介紹。下次發表博文的時候貼出來。
會在這里加一個連接。
/*構造器調用模式? 摒棄*/ ????
??? var quo=function(string){ ????
??????? this.status=string; ???????
} ???
quo.prototype.get_status=function(){ ??????
????? return this.status; ?????
?? } ???
var qq=new quo("aaa"); ???
alert(qq.get_status());
轉載于:https://www.cnblogs.com/wangqw-cn/p/4584660.html
總結
以上是生活随笔為你收集整理的js方法的声明与调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String 字符串对象
- 下一篇: Spark1.3.0安装