博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript之函数和this
阅读量:7208 次
发布时间:2019-06-29

本文共 1874 字,大约阅读时间需要 6 分钟。

一. 函数的内部属性

1. 在函数内部有两个特殊的对象:

arguments: 类数组对象,包含传入函数中的所有参数。其有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。
this: 引用的是函数据以执行的环境对象。

2. 在javascript中,函数的调用一共有4种方式:

(
作者:张立理  
链接:http://www.zhihu.com/question/19636194/answer/12504495 
来源:知乎)
(1) Function Invocation Pattern
诸如`foo()`的调用形式被称为Function Invocation Pattern,是函数最直接的使用形式,注意这里的foo是作为单独的变量出现,而不是属性。
在这种模式下,foo函数体中的this永远为Global对象,在浏览器中就是window对象。
(2) Method Invocation Pattern
诸如`foo.bar()`的调用形式被称为Method Invocation Pattern,注意其特点是被调用的函数作为一个对象的属性出现,必然会有“.”或者“[]”这样的关键符号。
在这种模式下,bar函数体中的this永远为“.”或“[”前的那个对象,如上例中就一定是foo对象。
(3) Constructor Pattern
new foo()`这种形式的调用被称为Constructor Pattern,其关键字`new`就很能说明问题,非常容易识别。
在这种模式下,foo函数内部的this永远是new foo()返回的对象。
(4) Apply Pattern
foo.call(thisObject)`和`foo.apply(thisObject)`的形式被称为Apply Pattern,使用了内置的`call`和`apply`函数。
在这种模式下,`call`和`apply`的第一个参数就是foo函数体内的this,如果thisObject是`null`或`undefined`,那么会变成Global对象。
应用以上4种方式,确定一个函数是使用什么样的Pattern进行调用的,就能很容易确定this是什么。
另外,this是永远不会延作用域链或原型链出现一个“查找”的过程的,只会在函数调用时就完全确认。

二. 函数属性和方法

1.每个函数都包含两个属性:

length: 表示函数希望接受的命名参数的个数。
prototype: 在创建自定义引用类型以及实现继承时,prototype属性的作用是及其总要的。

2.每个函数都包含两个非继承而来的方法:

apply()和call(),这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
apply方法接受两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中第二个参数可以是Array的实例,也可以是arguments对象。
example:
function sum(){
return num1 + num2; } function callSum1(){
return sum.apply(this,arguments); } function callSum2(){
return sum.apply(this,[num1,num2]) }
call()方法和apply()方法的作用相同,区别仅仅在于接收的参数方式不同,使用call时,传递给函数的参数必须逐个列举出来。
他们真正的用途是扩充函数赖以运行的作用域。
 
window.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
ECMAScript 5还定义了一个方法: bind()。其this值会被绑定到传给bind()函数的值。
var objectSayColor = sayColor.bind(o); objectSayColor();//blue

转载于:https://www.cnblogs.com/lucare/p/9312664.html

你可能感兴趣的文章
JS Bin Tips and Bits • About
查看>>
Sharepoint学习笔记—习题系列--70-576习题解析 -(Q40-Q44)
查看>>
nodejs发展
查看>>
Fragment过度动画分析一
查看>>
UBI文件系统简介
查看>>
《现代操作系统》精读与思考笔记 第一章 引论
查看>>
System.out.print实现原理猜解
查看>>
每日英语:The Invasion of the Online Tutors
查看>>
codepage IMLangCodePages
查看>>
Leetcode: Valid Parentheses
查看>>
JavaScript Structure
查看>>
java 流媒体服务器Red5 FQA
查看>>
mysql--SQL编程(关于mysql中的日期) 学习笔记2
查看>>
jquery 请求jsp传递json数据的方法
查看>>
Repeater绑定事件ItemDataBound中获取数据库中数据
查看>>
草长莺飞,总归一字
查看>>
HDOJ 2097
查看>>
计算机学科漫谈
查看>>
mac下配置openfire
查看>>
自定义控件实现(转)
查看>>