JavaScript系列:函数调用方式
有关JS的问题,持续更新..
一,函数调用的4种方式
1,函数调用模式
//下面这种模式叫 “函数调用模式”:窗后window来调用
//函数调用四种方式的基础
//这tm不就是作用域this的问题吗
//我们最常用的定义函数方式,function a(){}就是"函数调用模式",只要记得这种方法内的this是window便可。
function whichObj1() {
this.a = 1; //this==> window
alert(this.a+'+'+this);
}
whichObj1(); //本质window. whichObj1();用window可以“点”出这个方法
/*下面的定义函数,函数内的this,注意不是whichObj2,是window*/
/*这种采用var的定义函数方式,和 function whichObj2(){}一样*/
var whichObj2 = function () {
this.a = 2; //this==> window
alert(this.a + '+' + this);
}
whichObj2(); //本质window. whichObj1();用window可以“点”出这个方法
你懂this吗
函数调用函数
function fun1() {
alert("fun1");
}
function fun2() {
fun1(); // 在函数B中,调用A方法
alert("fun2");
}
fun2();
fun1(){fun2()},fun1执行的就是fun2()
下面看一个例子
<script type="text/javascript">
var add = function(a, b) {
return a + b;
}
var myObject = {
value:3
};
myObject.func = function() {
var helper = function() {
this.value = add(this.value, this.value); //此处3个value均为NAN,因为this指向window
}
// 函数调用模式
helper();
}
// 方法调用模式
myObject.func();
alert(myObject.value);//为3不是6
</script>
//为什么不是6呢
//改进
<script type="text/javascript">
var add = function(a, b) {
return a + b;
}
var myObject = {
value:3
};
myObject.func = function() {
var that = this; // this对应myObject对象 (1)
var helper = function() {
//this.value = add(this.value, this.value); //这里调用模式为函数调用模式,而非方法调用模式,所以this对应全局对象 (2)
that.value = add(that.value, that.value);
}
// 函数调用模式
helper();
}
// 方法调用模式
myObject.func();
alert(myObject.value);
</script>
函数调用模式:window直接调用。不是某个对象调用。
2,方法调用模式
//下面这种模式叫 “方法调用模式”:方法作为一个json对象的成员来调用。一般函数做为成员,我们通常称之为方法
//这种调用模式,方法内的this指的是本json对象
//这个json对象,随意可以"点"出一个成员(加入'点'出方法,那么这个方法内的this记得是这个json对象)
function makeArray(arg1, arg2) {
return [this, arg1, arg2];
}
var arrayMaker = {
someProperty: 'some value here',
make: makeArray
};
//invoke the make() method
console.log(arrayMaker.make('one', 'two'));
// => [ arrayMaker, 'one', 'two' ]
console.log(arrayMaker['make']('one', 'two'));
// => [ arrayMaker, 'one', 'two' ]
方法调用模式,json对象调用成员的2中方式
方法调用模式和函数调用模式区别:this的大转变
function makeArray(arg1, arg2) {
return [this, arg1, arg2];
}
console.log(makeArray('one', 'two'));//this指向window
//但是将此函数放到json对象,为为一个方法来调用,怎么this就从window变成了json对象了呢?
方法调用模式和函数调用模式的对比,同一个函数,this指向怎么就变了呢?
我们不去谈理论上的作用域链,记住:哪个对象调用这个fucntion a(){this...},这this就指哪个对象。
上面在一个函数里面:var helper=function(){this.value..},请问这个helper函数的调用对象是谁?
没写默认值window,ok,所以this指向window。json对象调用,ok,this就是这个json对象。
哦,有人和var 这个有点乱,明确:和私有、公有木有关系。
哦,有人和fucntion helper(){this..}这种有点乱,明确:这两种几乎一样,ok,就把这两种当成一样。
再说,内嵌的函数使用外部函数的变量,也就是形成了闭包。
现在想一想,这两种模式,本质都一样嘛~window也是对象嘛~~为啥window调用函数非叫“函数调用模式”呢?其实就是比较”特殊的方法调用模式“而已。
不行,我还要举个常用的例子,看真正懂上面的不
<input type="button" value="Button 1" id="btn1" />
<input type="button" value="Button 2" id="btn2" />
<input type="button" value="Button 3" id="btn3" onclick="buttonClicked();"/>
<script type="text/javascript">
function buttonClicked(){
var text = (this === window) ? 'window' : this.id;
alert( text );
}
var button1 = document.getElementById('btn1');
var button2 = document.getElementById('btn2');
button1.onclick = buttonClicked;
button2.onclick = function(){ buttonClicked(); };
</script>
input的click事件中的this
第四
function doSomething (obj,evt) {
var text =obj===window?window:obj.id;
alert(text);//child2
}
<div id="child2" onclick="doSomething(this,event);" style="width:200px;height:200px;background-color:lightblue;">
第一,this为所属的对象(按钮元素)。btn1
第二,外函数调用内函数,内函数函数体的this指的window。是window调用的。window
第三,和第二个一样。window
第四,dom中的this,指向就是这个dom元素
3,构造器调用模式
有关这个篇幅要长..
4,call apply调用方式
区别:call方法传参的时候,多加一个对象,参数依次写就ok。apply,多传一个对象,参数必须放到数组内
JavaScript系列:函数调用方式的更多相关文章
- JavaScript中七种函数调用方式及对应 this 的含义
this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...
- javascript系列之this
原文:javascript系列之this 引言 在这篇文章里我们将会讨论与执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题是足够难的并且在不同的执行上下文中判定this的 ...
- JavaScript 系列博客(三)
JavaScript 系列博客(三) 前言 本篇介绍 JavaScript 中的函数知识. 函数的三种声明方法 function 命令 可以类比为 python 中的 def 关键词. functio ...
- javaScript系列 [06]-javaScript和this
在javaScript系列 [01]-javaScript函数基础这篇文章中我已经简单介绍了JavaScript语言在函数使用中this的指向问题,虽然篇幅不长,但其实最重要的部分已经讲清楚了,这篇文 ...
- 深入理解JavaScript系列(26):设计模式之构造函数模式
介绍 构造函数大家都很熟悉了,不过如果你是新手,还是有必要来了解一下什么叫构造函数的.构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成 ...
- 深入理解JavaScript系列(24):JavaScript与DOM(下)
介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...
- 深入理解JavaScript系列(16):闭包(Closures)
介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...
- 深入理解JavaScript系列(15):函数(Functions)
介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...
随机推荐
- Java性能优化权威指南-读书笔记(四)-JVM性能调优-延迟
延迟指服务器处理一个请求所花费的时间,单位一般是ms.s. 本文主要讲降低延迟可以做的服务器端JVM优化. JVM延迟优化 新生代 新生代大小决定了应用平均延迟 如果平均Minor GC持续时间大于应 ...
- [产品相关] A/B测试终极指南(翻译)
转载地址: http://blog.sina.com.cn/s/blog_9149268d0100zrx7.html 还记得以前导师说看了英文的文章就把它翻译一下吧,这样会对文章更好地理解,也会有更深 ...
- Android涉及到的设计模式
转载地址:http://blog.csdn.net/dengshengjin2234/article/details/8502097 1.适配器模式:ListView或GridView的Adapter ...
- sublime text3侧边栏主题不生效问题解决
sublime text3主题插件: Seti_UI 插件安装: 在线安装:需要FQ window: ctrl+shift+p 找install package:之后搜索 Seti_UI 安装完成后需 ...
- poj 1330 LCA
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #i ...
- java_ant详解
转自:http://hi.baidu.com/victorlin23/item/721b892c770be3d7a517b695 1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说 ...
- 0x和H都表示十六进制有什么区别吗?
0x是16进制的前缀,H是16进制的后缀 都是表示十六进制数,意义上没有什么区别,完全相等.至于什么时候用0x,什么时候用H,这取决于你在什么环境下使用,如果在C/C++,必须用0x来表示. 在C语言 ...
- dip,px,pt,sp的区别
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...
- Codeforces Round #267 (Div. 2) C. George and Job DP
C. George and Job The new ITone 6 has been released ...
- 【原】storm源码之storm代码结构【译】
说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助 ...