關於jscall源碼的信息

本文目錄一覽:

請教一個js函數裡面的call方法

親,call方法:

語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

定義:調用一個對象的一個方法,以另一個對象替換當前對象。

說明:

call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。

如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。

看看下面的例子你就明白為什麼那裡沒有執行:

function add(a,b)

{

alert(a+b);

}

function sub(a,b)

{

alert(a-b);

}

add.call(sub,3,1);

這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果為:alert(4); // 注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。

js讀取遠程網頁源碼

代碼如下:

!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”

html

head

meta http-equiv=”Content-type” content=”text/html; charset=utf-8″

title遠程網頁源代碼讀取/title

style type=”text/css”

/* 頁面字體樣式 */

body, td, input, textarea {

font-family:Arial;

font-size:12px;

}

/style

script type=”text/javascript”

//用於創建XMLHttpRequest對象

function createXmlHttp() {

//根據window.XMLHttpRequest對象是否存在使用不同的創建方式

if (window.XMLHttpRequest) {

xmlHttp = new XMLHttpRequest(); //FireFox、Opera等瀏覽器支持的創建方式

} else {

xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);//IE瀏覽器支持的創建方式

}

}

//直接通過XMLHttpRequest對象獲取遠程網頁源代碼

function getSource() {

var url = document.getElementById(“url”).value; //獲取目標地址信息

//地址為空時提示用戶輸入

if (url == “”) {

alert(“請輸入網頁地址 。”);

return;

}

document.getElementById(“source”).value = “正在載入……”; //提示正在載入

createXmlHttp(); //創建XMLHttpRequest對象

xmlHttp.onreadystatechange = writeSource; //設置回調函數

xmlHttp.open(“GET”, url, true);

xmlHttp.send(null);

}

//將遠程網頁源代碼寫入頁面文字區域

function writeSource() {

if (xmlHttp.readyState == 4) {

document.getElementById(“source”).value = xmlHttp.responseText;

}

}

/script

/head

body

h1遠程網頁源代碼讀取/h1

div

地址:input type=”text” id=”url”

input type=”button” onclick=”getSource()” value=”獲取源碼”

/div

textarea rows=”10″ cols=”80″ id=”source”/textarea

/body

/html

js中的call

java中對象包含屬性和方法, 方法即函數, 只有對象可以調用方法

但是js中一切皆對象, 函數是對象, 函數也可以調用方法

Function.prototype.call

Function.prototype.apply

Function.prototype.bind

Function.prototype.toString

為什麼js語言會在function原型上掛上這四個函數?

因為好處太多了, 現在我就說一說call的應用

再深入思考一下, call語法是基於什麼形成的呢 ?

了解底層語法有助於我們理解高級的語法

因為在底層的語法眼中, 高級語法只不過是工具, 根本不算語法, 不過是由我定義構建處理來的

理解call函數, 核心必要知識

哈哈哈, v8內部的不知道, 反正js基於現有語法就有這個能力 (還有解法, 基於 proto ,原型鏈的方式, var temp = Object.create(null)), 利用乾淨的地方, 防止覆蓋原對象的函數

顯然, 我們自己的上面的mycall還要很多問題

這裡我們就實現了自己的call, 以後看見call就知道都不過是些雕蟲小技了(當然真實的實現方式肯定需要考慮更多因素和性能, 而且在v8更大的環境下, 可能還不止一種實現方式,保持謙虛)

js call 函數問題

call函數是就來糾正this指針的。

直接寫var args=Array.prototype.slice(arguments,1,2)的話,在slice這個函數裡面,this指針指向的是testFunction這個函數的包含體,但是用call的話,slice函數裡面,this指針就指的是arguments這個對象了。

JS中關於call()方法的一個問題,如圖中所示,求高手詳解。

在分析這四種代碼前,首先得弄清楚,如果一個對象obj調用了f函數,這個obj會發生什麼樣的變化。

obj.f();

上面的代碼中對象obj調用了f函數,在f函數里,第一句是this.a = ‘A’。那麼這個this是指什麼?如果你不清楚,那我直接說好了。this就是只那個調用f函數的對象,顯然在這裡是obj。那麼this.a = ‘A’實際上就是obj.a = ‘A’,也就是說,obj多了一個屬性a,其值為A。同樣的道理,第二句代碼給obj添加了一個屬性b,其值是一個函數,alert出一個B。

明白了嗎?obj.f()的直接影響就是obj.a = ‘A’,obj.b = function(){alert(‘B’)}。

弄明白了obj.f()的影響,接下來要搞清楚的就是f.call(obj)是一種怎麼樣的調用。如果你了解call這個函數,你可以知道的更多些;如果你不了解,希望你自己去仔細研究下,我這裡只能直接告訴你:

f.call(obj)相當於obj.f()

看到了嗎,這就是為什麼要先講清楚obj.f()的影響。因為f.call(obj)其實就是obj.f()。

此時再來看這四種調用。

第一種:

首先來看看第一句,根據前面的分析,我們知道,此時e.a = ‘A’。那麼第二句幹了什麼呢?第二句alert(a),顯然這a和e是沒有關係的,由於變數a事先沒有定義,在js中不能直接使用未定義的變數,alert(a)其實出錯了,所以你沒有看到任何反應。但如果你使用開發者工具,就能看到,這樣的寫法已經報錯了。錯誤的代碼,自然沒有任何反應。

第二種:

第二種比較繞,還是來看看它的調用過程吧。f.call(e.t),這個e.t是什麼?因為e沒有t這個屬性,所以這句相當於f.call(undefined)。當call函數的第一個參數是undefined或者null時,f.call(undefined)就相當於f(),也相當於window.f()。那麼根據開頭的分析,這時f函數的調用者就是window了,也就是說window.a =’ A’了。第二句alert(a),顯然在函數e的作用域里,變數a是不存在的,所以js會到window的作用域去查找屬性a,而window的屬性a是有的,它的值是A,所以這個時候alert(a)就是alert(window.a),alert的結果就是A。

第三種:

我覺得看了前兩種調用的分析,你應該知道f.call(y.t)相當於什麼,它相當於y.t.f(),但遺憾的是,y這個變數並沒有定義,無論是在函數e的作用域內還是window的作用域內,y都是不存在的,而使用一個未定義的變數,是一種錯誤的語句,所以帶三種調用和第一種一樣,是錯了,alert(a)根本就沒有執行,因此沒有任何反應;當然,就算執行了alert(a)也是錯的,它和第一種調用的錯誤就一樣了。

第四種:

第四種應該是比較容易理解的了。根據開頭的分析,f.call(e),e.a = ‘A’,這個沒有意見吧?所以第二句alert(e.a)就alert出了A。

對於javascript 中的call函數的理解問題

標準解釋:call方法是將一個對象的方法在另一個對象的上下文環境中執行。

詳細解釋:你的例子中,myFun.call(myObject, 13, 3, 95)執行時是這樣的:

1. 調用myFun函數

2. 將13,3,95三個參數傳遞給它(你的myFun方法中沒有處理這些參數的代碼,所以傳了也沒有用)

3. 將myFun函數中的所有this用myObject代替(同樣,你的myFun函數中沒有使用this,所以執行結果和直接調用myFun()是一樣的)

修改一下你的例子,幫助你理解:

function myFun(p1, p2, p3)

{

this.para1 = p1;

this.para2 = p2;

this.para3 = p3;

}

var myObject = new Object();

alert(myObject.para1) //顯示undefined

myFun.call(myObject,13,3,95); /*執行的時候,myFun方法中的this全部用myObject對象代替,所以在這個例子中,執行myFun方法和直接寫下面的語句效果是一樣的:

myObject.para1 = 13;

myObject.para2 = 3;

myObject.para3 = 95;

*/

alert(myObject.para1) //顯示13

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/241817.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:43
下一篇 2024-12-12 12:44

相關推薦

  • 雲智直聘 源碼分析

    本文將會對雲智直聘的源碼進行分析,包括前端頁面和後端代碼,幫助讀者了解其架構、技術實現以及對一些常見的問題進行解決。通過本文的閱讀,讀者將會了解到雲智直聘的特點、優勢以及不足之處,…

    編程 2025-04-29
  • Java 監控介面返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控介面返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python網站源碼解析

    本文將從多個方面對Python網站源碼進行詳細解析,包括搭建網站、數據處理、安全性等內容。 一、搭建網站 Python是一種高級編程語言,適用於多種領域。它也可以用於搭建網站。最常…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • 源碼是什麼

    源碼是一段計算機程序的原始代碼,它是程序員所編寫的可讀性高、理解性強的文本。在計算機中,源碼是指編寫的程序代碼,這些代碼按照一定規則排列,被計算機識別並執行。 一、源碼的組成 源碼…

    編程 2025-04-27
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Go源碼閱讀

    Go語言是Google推出的一門靜態類型、編譯型、並髮型、語法簡單的編程語言。它因具有簡潔高效,內置GC等優秀特性,被越來越多的開發者所鍾愛。在這篇文章中,我們將介紹如何從多個方面…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27

發表回復

登錄後才能評論