搜尋
首頁web前端js教程JavaScript函數怎麼用?JavaScript函數的屬性和方法的介紹

JavaScript函數是什麼? JavaScript中的函式其實是對象,因為每個函式都是Function這個建構子的實例,具有Funtion建構子定義的屬性和方法。下面我們就來具體看看JavaScript函數的屬性和方法的介紹。

函數名稱其實是指向函數物件的指針,看如下程式碼:

    function sum(a,b) {
        return a + b;
    }
    // 相当于把sum的引用地址传递给sum2。
    // 注意:不带圆括号的函数名是访问函数指针,而非调用函数
    var sum2 = sum; 
    sum2(1,2) // 3
    sum = null;
    sum(2,3) // undefined // 将sum的内存回收,即sum的引用地址变了
    sum2(2,3) //5 // 但sum2 还是指向原来的内存地址

上面這個程式碼可以說明函數名稱其實是指向函數物件的指標這個問題。對於上述問題理解之後我們可以進行如下的分析:

1、沒有重載

理解了上面之後,重載相當於給函數變數重新修改了引用的值,因此後面會覆蓋前面的,很容易理解了。

2、函數提升

其實和變數提升類似,就是宣告型函數和表達式定義函數的差別,很簡單

3、作為值的函數

因為函數名稱本身就是一個變量,所以可以作為值傳遞,這裡有一個很好的例子,也是一個很好的程式設計思想,如下:

function getSomeFunction(fn,arg) {
    return fn(arg);
} 
function add(num) {
    return num + 10;
}
function getGreeting(name) {
    return `Hello ${name}`;
}
getSomeFunction(add,5) // 15
getSomeFunction(getGreeting,'andy') // Hello andy

還可以從一個函數中傳回另一個函數。例如我們在用數組的一些排序方法或迭代方法的時候,因為傳遞進去的都是一個函數變數作為參數,所以這個參數我們可以用「外部函數返回函數」的方法進行編寫,這樣做的好處是,傳回的函數可以把我們」特定想要規定」的參數傳遞進去進行計算,例如

// 规定利用哪个属性进行排序,如果不填则代表数组从大到小排序
function sortArgFuntion(compareProperty) { //compareProperty是上文中特定想要规定的参数

    return function (val1, val2) {
        if (compareProperty === undefined) {  // 如果排序的是数组的值,则用常规的方法
            if (val1 > val2) {
                return 1;
            } else if (val1  val2[compareProperty]) {
                return 1;
            } else if (val1[compareProperty] <p>sort函數的參數是個函數,用於將陣列進行重新排序。而我們將這個函數參數拿出來,就可以更直覺的、多用性更高的去寫這個函數,達到我們想要的效果。同時需要仔細揣摩,理解函數傳回函數的精髓與獨到之處</p><p><span style="font-size: 16px;"><strong>#4.函數內部屬性</strong></span></p><p>函數內部有兩個特殊變數</p>
  • arguments

  • this

arguments

##是類別數組對象,何為類別數組對象呢?可以透過序號進行數組式的存取(如obj[1]),並且有length屬性(對像你不定義length屬性,是沒有length的).類數組只有索引值和長度,沒有數組的各種方法,所以如果要類別陣列呼叫數組的方法,就需要使用

Array.prototype.method.call 來實作

this##this是JavaScript非常容易混淆和複雜的一個知識點,他代表什麼完全取決於調用位置,我會但列出一篇總結this。 e.g:

window.color = 'red';
var o = {color:"blue"};
function sayColor() {
    console.log(this.color)
}
sayColor(); // red 因为调用位置是全局
o.sayColor = sayColor;
o.sayColor(); // blue 因为调用位置是o的对象里

從上面例子我們要知道,函數名字只是一個指針,雖然執行環境不同,全局的sayColor()和函數中的o.sayColor()指向的都是同一個函數

caller

es5新加的,他傳回目前函數(必須是函數,物件不行)的呼叫環境,如果呼叫環境是全域,則傳回null。有兩種用法,一種是函數名稱加caller,一種是arguments.callee.caller

    function outer() {
        console.log(outer.caller); //null
        inner();
    };
    function inner() {
        console.log(inner.caller); // outer里的代码
    }

5、函數的屬性和方法##因為函數也是對象,所以也有屬性和方法;函數裡面有length和prototype兩個屬性,length指傳入形參的個數

function add(num1,num2) {}  console. log(add.length) // 2


propertype

對於參考類型而言,propertype是保存所有實例方法的真正所在。 在創建自訂引用類型以及實現繼承,它的作用及其關鍵(到底多關鍵暫時還不太理解,尤其是繼承這個詞:))

es5中propertype不可枚舉,因此不能遍歷。

apply() 和call()

兩個參數,第一個參數是在哪個作用域運行,第二個參數apply是傳入的Array或是arguments對象,call是傳入每個值,其餘他兩個一模一樣。這是其中一個例子,用來說明apply和call的作用:

    var color = "red";
    var o = {color:"blue"};
    function sayColor() {
        alert(this.color)
    }
    sayColor(); // red
    sayColor.call(this); // red 
    sayColor.call(window); // red
    sayColor.call(o); // blue
如果不用call的話我們需要這樣做:

    var color = "red";
    var o = {color:"blue"};
    function sayColor() {
        alert(this.color)
    }
    o.sayColor = sayColor;
    o.sayColor(); //blue
所以對比可以一目了然,call一個最大的作用是實現了物件和方法的解耦

bind方法

bind方法用來建構一個函數的實例,其this物件指向bind規定的作用域。

例如:

    var color = "red";
    var obj = {color:"blue"}
    function sayColor() {
        console.log(this.color);
    }
    var bindSayColor = sayColor.bind(obj);
    bindSayColor(); // blue
相關文章建議:

javascript函數


Javascript 普通函數與建構函數的差異


JavaScript中函數宣告、呼叫詳解

以上是JavaScript函數怎麼用?JavaScript函數的屬性和方法的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具