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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;发现部分…