javascript函數調用的各種方法!!

在JavaScript中一共有下面4種調用方式:
(1)?基本函數調用
(2)方法調用
(3)構造器調用
(4)通過call()和apply()進行調用
1.?基本函數調用

普通函數調用模式,如:

JavaScript code?
1
2
3
4
??function?fn(o){
?????……?
??}
??fn({x:1});


在基本函數調用中,
(1)每個參數作為實參傳遞給聲明函數時定義的形參;
(2)this被綁定到全局變量(直接調用一般指的是window)

JavaScript code?
1
2
3
4
5
6
7
8
9
10
??var?object?=?{value:1};
??var?value?=?2;
?object.printProps?=?function(){
????var?printValue?=?function(){
??????console.log(this.value);
????};
???printValue();
???console.log(this.value);
?}
?object.printProps();


此時的運行結果是:
?2
?1

在printValue()函數在執行時,this.value值為2,也就是說,this指向的是全局對象,而不是對象object。

(3)返回值:函數的返回值成為調用表達式的值。
I.?如果函數返回是解釋器到達結尾,也就是沒有執行到return?XXX的語句。返回值為undefined。?
II.?如果函數返回是因為接受器執行到return?xxx語句,?返回return之后的值。?
III.?如果return語句后沒有值,即return,則返回undefined。

2.?方法調用

當一個函數被保存為對象的一個屬性時,稱為方法。
(1)參數和返回值的處理與函數調用一致;
(2)調用上下文this為該對象

JavaScript code?
1
2
3
4
5
6
7
8
9
10
11
??
function?print(){
????console.log(this.value);?
??}
??var?value=1;
??var?object?=?{value:2};
??object.m?=?print;
??//作為函數調用
??print();
??//作為方法調用
??object.m();


運行結果為:
?1
?2

當調用print時,this綁定的是全局對象,打印全局變量value值1。
但是當調用object.m()時,this綁定的是方法m所屬的對象Object,所以打印的值為Object.value,即2。

3.?構造器調用

?函數或方法調用之前帶有關鍵字new,它就構成構造函數調用。如:

JavaScript code?
1
2
?function?fn(){……}
?var?obj?=?new?fn();


(1)參數處理:一般情況構造器參數處理和函數調用模式一致。但如果構造函數沒用形參,JavaScript構造函數調用語法是允許省略實參列表和圓括號的。

如:下面兩行代碼是等價的。

JavaScript code?
1
2
??var?obj?=?new?Object();
??var?obj?=?new?Object;


(2)函數的調用上下文為新創建的對象。

JavaScript code?
1
2
3
4
5
6
7
8
9
10
?function?fn(value){
???this.value?=value;
?}
?var?value?=1;
?var?obj?=?new?fn(2);
?console.log(value);
?console.log(obj.value);
?fn(3);
?console.log(value);
?console.log(obj.value);



運行結果:
?1
?2
?3
?2

?I.?第一次調用fn()函數是作為構造函數調用的,此時調用上下文this被綁定到新創建的對象obj。所以全局變量value值不變,obj新增一個屬性value,值為2;
?II.?第二次調用fn()函數是作為普通函數調用的,此時調用上下為this被綁定到全局對象,在瀏覽器中為window。所以全局對象的value值改變為3,而obj的屬性值不變。

(3)構造函數通常不使用return關鍵字,返回值為新對象。而如果構造函數顯示地使用return語句返回一個對象,那么調用表達式值就為這個對象。如果構造函數使用return語句但沒有指定返回值或者返回一個原始值,則忽略返回值,同時使用新對象作為調用結果。

4.通過call()和apply()進行調用

雖然在一個獨立的函數調用中,根據是否是strict模式,this指向undefined或window,不過,我們還是可以控制this的指向的!要指定函數的this指向哪個對象,可以用函數本身的apply()或call()方法,它們都是接收兩個參數。

call()方法使用它自有的實參列表作為函數的實參,apply()方法要求以數組的形式傳入參數

apply方法第一個參數是改變后的調用對象,第二個參數是將函數參數以數組形式傳入[?],而call()第一個參數與call()方法相同,第二個參數是原來參數序列......。

轉載于:https://www.cnblogs.com/msidevs/p/6058232.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456978.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARM TK1 安裝kinect驅動

首先安裝usb庫 $ git clone https://github.com/libusb/libusb.git 編譯libusb需要的工具 $ sudo apt-get install autoconf autogen $ sudo apt-get install libtool $ sudo apt-get install libudev* 編譯安裝 $ sudo ./autogen.sh $ sudo make $ sudo make install $ sudo l…

如何在一個html頁面中提交兩個post,如何在同一個頁面上從Django和Ajax獲得多個post請求?...

我一整天都在為這事犯愁。似乎什么都沒用。這是我的情況。在我有一個Django表單,有兩個字段:redirect_from,redirect_to。此表單有兩個提交按鈕:Validate和{}。當頁面加載時,Submit被隱藏,只顯示Validate。…

大數據入門:各種大數據技術的介紹

大數據我們都知道hadoop,可是還會各種各樣的技術進入我們的視野:Spark,Storm,impala,讓我們都反映不過來。為了能夠更好的架構大數據項目,這里整理一下,供技術人員,項目經理&#xf…

高可用與負載均衡(5)之基于客戶端的負載均衡

什么是客戶端負載均衡 基于客戶端的負載均衡,簡單的說就是在客戶端程序里面,自己設定一個調度算法,在向服務器發起請求的時候,先執行調度算法計算出向哪臺服務器發起請求,然后再發起請求給服務器。 基于客戶端負載均衡…

Variant 與 內存泄露

http://blog.chinaunix.net/uid-10386087-id-2959221.html 今天遇到一個內存泄露的問題。是師兄檢測出來的。Variant類型在使用后要Clear否則會造成內存泄露,為什么呢? Google一下找到下面一篇文章,主要介紹了Com的內存泄露,中間有…

安裝安全類軟件進行了android簽名漏洞修補,魅族MX3怎么升級固件體驗最新比較穩定的版本...

魅族mx3固件怎么升級?flyme os系統會持續更新,升級魅族MX3手機系統需先下載MX3的升級固件,升級固件分為體驗版和穩定版。魅族MX3固件有體驗版和穩定版兩種,顧名思義,體驗版為最新版但相比穩定版來說存在更多的漏洞,升…

linux su切換用戶提示Authentication failture的解決辦法

由于ubtun系統默認是沒有激活root用戶的,需要我們手工進行操作,在命令行界面下,或者在終端中輸入如下命令: sudo passwd Password:你當前的密碼 Enter new UNIX password:這個是root的密碼 Retype new …

@property

class Person(object):def __init__(self, name,age):#屬性直接對外暴露#self.age age#限制訪問self.__age ageself.__name namedef getAge(self):return self.__agedef setAge(self,age):if age<0:age 0self.__age age#方法名為受限制的變量去掉雙下劃線propertydef a…

ubuntu入門知識

1、linux系統發展歷史 unix -> Linux -> ubuntu linux發展軌跡圖 2、ubuntu下載和安裝 推薦使用長期支持版本&#xff1a; 10.04,12.04,14.04或LTS版本 安裝環境VMware虛擬機 3、安裝之后創建root sudo passwd root 輸入root用戶密碼即可 4、安裝軟件&#xff1a; 更新軟…

html 二級試題,計算機二級考試WEB試題及答案

計算機二級考試WEB試題及答案當前主要的 WEB數據庫訪問技術有哪些?答&#xff1a;到目前為止&#xff0c;WEB數據庫訪問技術主要分為兩大類&#xff1a;(1)公共網關接口技術(CGI);CGI 是 WEB 服務器運行時外部程序的規范&#xff0c;按照 CGI 編寫的程序可以擴展服務器的功能&…

細數阿里云服務器的十二種典型應用場景

原文鏈接&#xff1a;http://click.aliyun.com/m/13910/免費開通大數據服務&#xff1a;https://www.aliyun.com/product/odps文章轉載&#xff1a;小白楊1990如今&#xff0c;阿里云的產品可謂是多種多樣&#xff0c;紛繁復雜。面對各種各樣的技術和產品&#xff0c;ECS、RDS、…

動態給實例添加屬性和方法

from types import MethodType#創建一個空類 class Person(object):__slots__ ("name","age","speak","height")per Person() #動態添加屬性&#xff0c;這體現了動態語言的特點(靈活&#xff09;per.name "tom" print(…

android導入項目出現style錯誤,menu錯誤

android導入項目出現style錯誤&#xff0c;menu錯誤 style //查看 res/values/styles.xml 下的報錯點。<style name"AppBaseTheme" parent"Theme.AppCompat.Light"> //把這個改成 <style name"AppBaseTheme" parent"android:The…

Vim的基本操作總結

最近在學習Linux基礎的時候&#xff0c;對Vim的基本操作時遇到很多問題&#xff0c;如編輯錯誤&#xff0c;無法退出Vim等。通過一系列的學習后才解決了這些問題&#xff0c;希望這個過程能對后來者有所幫助 先對Vim的三種模式做個大致的介紹&#xff1a; Vi有三種基本工作模式…

html股票數據代碼,股票數據的網站抓取(4.2)代碼優化

#codingutf-8from selenium import webdriverimport timeimport osimport reimport sysimport threadingimport Queueimport Tkinter as tkfrom selenium.common.exceptions import NoSuchElementExceptiondef myinit():reload(sys)sys.setdefaultencoding(utf8)#獲取屏幕分辨率…

對象屬性和類屬性

class Person(object):#這里的屬性實際上屬于類屬性&#xff08;用類名調用&#xff09;name "person"def __init__(self,name):#對象屬性self.name nameprint(Person.name) per Person("tom") #對象屬性的優先級高于類屬性 print(per.name) #動態的給對…

commons-fileupload、smartUpload和commons-net-ftp

1.本地上傳 在許多Web站點應用中都需要為用戶提供通過瀏覽器上傳文檔資料的功能&#xff0c;例如&#xff0c;上傳個人相片、共享資料等。在DRP中&#xff0c;就有這個一個功能&#xff0c;需要將對應的物料圖片上傳并顯示。對于上傳功能&#xff0c;其實在瀏覽器端提供了很好的…

11月14號站立會議(從即日14號起到24號截至為final階段工作期)

小組名稱&#xff1a;飛天小女警 項目名稱&#xff1a;禮物挑選小工具 小組成員&#xff1a;沈柏杉&#xff08;組長&#xff09;、程媛媛、楊鈺寧、譚力銘 代碼地址&#xff1a;HTTPS:https://git.coding.net/shenbaishan/GIFT.git SSH&#xff1a;gitgit.coding.net:shenbais…

初學大數據之Pycharm常用的快捷鍵總結

pycharm快捷鍵及一些常用設置&#xff0c;有需要的朋友可以參考下。 加粗的都是個人認為比較常用的快捷鍵 AltEnter 自動添加包 Ctrlt SVN更新 Ctrlk SVN提交 Ctrl / 注釋(取消注釋)選擇的行 CtrlShiftF 高級查找 CtrlEnter 補全 Shift Enter 開始新行 TAB ShiftTAB…

搖一搖 聲音 html5,HTML5搖一搖以及音頻播放問題優化總結

前言感想&#xff1a;不放過任何一個WARNING、ERROR或者不夠好的體驗點&#xff0c;持續不斷優化&#xff0c;精益求精&#xff0c;我們就能夠得到提高。1. 搖一搖不夠靈敏、搖動很多次沒有響應的問題、原來搖一搖代碼是從網絡Copy的&#xff0c;活動上線后&#xff0c;發現部分…