Heim > Artikel > Web-Frontend > Was sind die Funktionstypen in js?
有意思的根源在于- 函数也是对象,同样有拥有属性和方法。 由于函数是是对象,那么函数名也就相当于指向函数对象的指针 通常函数是由"函数声明"创建:
1 function(sum1,sum2){ 2 reutnr sum1 + sum2; 3 }
也可以使用"函数表达式"创建:
1 var sum = function(sum1,sum2){ 2 return sum1+sum2; 3 };
还有一种方式使用"构造函数"创建: (但不推荐)
<span style='font-family: "Microsoft YaHei"; font-size: 16px'> //这种方式,会导致两次解析代码,第一次解析常规的代码,第二次解析传入构造函数中的字符串。</span><br><span style='font-family: "Microsoft YaHei"; font-size: 16px'>1 <span style="color: #0000ff">var</span> sum = <span style="color: #0000ff">new</span> Function("sum1","sum2","return sum1+sum2")</span>
"函数声明"与"函数表达式"的区别在于:
Funktion Der Ausdruck hat keinen Funktionsnamen
Der Funktionsausdruck erfordert eine Semikolon-Endung
上面提到,函数是对象,而函数名仅仅是执行函数对象的指针。 这代表着,通过将函数名赋值给其他变量,其他变量则也可以通过自身调用该函数。 注意: 访问函数对象指针时,则需要带小括号,如上面函数访问 sum 函数的指针 则需要将 sum 赋值给一个变量,该变量便可拥有指向同等函数的指针。
eg: var sum1 = sum; // sum(); sum1(); 执行的结果相同
强调: 使用 "函数名+()",代表着调用该函数, 不添加 "()",则代表访问该"指向该函数对象的指针" 将函数名设置为 null ,则可以使其指向的函数断绝联系。
eg: sum = null; // sum(); 则会报错,提示sum不是一个函数, null代表着空对象指针
相同的函数名,后者会替换前者(函数声明或者函数表达式都是如此,这里以函数声明为例子)
eg: function sum(sum1){ return sum1+ 100 } function sum(sum2){ return sum2+ 200 } sum(100); // 300;
js解析器在对于这两者是由区别的。 函数声明的函数,在开始执行代码之前,就会通过函数声明提升的过程,读取并将函数声明添加到执行环境中。 即使函数在调用函数后面,也不会影响函数求值。 而函数表达式则不会,解析器必须执行到当前代码块才会被初始化并执行。如果调用在前,则
在JS中,函数名本身就是变量。所以函数也可以作为值来使用。 也就是说,不仅仅可以作为一个函数的参数,也可以作为一个函数的返回值。 而sort() 方法只能根据 tostring() 的值来排序
eg: var data = [{name:'A',age:2},{name:'B',age:1}] // 创建指定属性的函数 function setAttr(name){ return function(o1,o2){ var v1 = o1[name]; var v2 = o2[name]; if(v1 < v2) { return -1; } else if(v1 > v2) { return 1; } else { return 0; } } } //使用sort()方法调用 data.sort(setAttr('age')); // [{name,:'B',age:'1'},{name:'A',age:'2'}] data.sort(setAttr('name')); // [{name:'A',age:'2'},{name,:'B',age:'1'}]
每个函数都包含两个属性: length, prototype; length : 表示函数接收的参数个数。
1 eg: funciont sum(test){} //sum.lenght == 1;
<span style="font-family: "Microsoft YaHei"; font-size: 16px"><span style="background-color: #ffffff"><strong> prototype: </strong></span>在JS中,该属性是保存所有实例方法的真正所在。 在创建自定义引用类型以及实现继承时,该属性是非常重要的。<strong><span style="background-color: #ffffff"> prototype: </span></strong>属性是不可枚举的,因此不能使用for in发现。<br/> 通过构造函数的 <strong><span style="background-color: #ffffff">prototype </span></strong>属性,创建的方法或者属性,都会被它的实例对象所继承,从而实现继承机制。<br/></span>
每个函数都包含两个非继承而来的方法: apply() 与 call(); 两者区别在于,第二个参数的不同。 该方法强大在于,可以扩充函数赖于运行的作用域。 apply(): 第一参数是在其中运行函数的作用域,另一个是参数数组。 call() : 第一参数是在其中运行函数的作用域,其他参数直接传递给函数, 也就是除第一个参数,其他都是逐个列举出来。 使用场景: 两者结果没有任何区别,而具体使用哪个,则取决于你传入的参数使用哪个方法方便。 如果传入参数是一个数组则使用 apply 更合适一点,否则 call() 更合适一点。
Das obige ist der detaillierte Inhalt vonWas sind die Funktionstypen in js?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!