<script type="text/javascript"> 
function makeArray(arg1, arg2){ 
   return [ this, arg1, arg2 ]; 

</script>最常用的方法,但不幸的,全局的函数调用 
当我们学习Javascript时,我们了解到如何用上面示例中的语法来定义函数。 
,我们也知道调用这个函数非常的简单,我们需要做的仅仅是:

makeArray('one', 'two'); 
// => [ window, 'one', 'two' ]Wait a minute. What's that window object doing there? Why is it the value of this? If you haven't stopped to think about it, please stay with me here. 
在 Javascript里,我没有指特定的浏览器,有一个全局的对象, 那些看起来散落在你的脚本里的每一行代码(例如在一个对象外的声明)其实都被写在了一个全局对象的上下文里.在我们的例子中,其实那个makeArray 函数可以说不是一个松散的全局函数,而是全局对象的一个方法, 让我们返回来看浏览器,在这个环境里它的全局对象被映射到window对象.让我们来证明一下:

alert( typeof window.methodThatDoesntExist ); 
// => undefined 
alert( typeof window.makeArray); 
// => function所有的这些意味着我们之前调用 makeArray的方法是和下面调用的方法一样的

window.makeArray('one', 'two'); 
// => [ window, 'one', 'two' ]我说最普遍的调用方法是不幸的是因为它导致我们声明的函数默认是全局的.我们都知道全局成员不是编程的最佳实践.这在JavaScript里是特别的正确,在JavaScript中避免使用全局的成员。

JavaScript函数调用规则1 
在没有通过明确所有者对象而直接调用的函数中,如myFunction(),将导致this的值成为默认对象(浏览器中的窗口)。

函数调用 
让我们现在创建一个简单的对象,使用 makeArray函数作为它的一个方法,我们将使用json的方式来声明一个对象,我们也来调用这个方法

//creating the object 
var arrayMaker = { 
   someProperty: 'some value here', 
   make: makeArray 
};

//invoke the make() method 
arrayMaker.make('one', 'two'); 
// => [ arrayMaker, 'one', 'two' ] 
// alternative syntax, using square brackets 
arrayMaker['make']('one', 'two'); 
// => [ arrayMaker, 'one', 'two' ]看到这里的不同了吧,this的值变成了对象本身.你可能会疑问原始的函数定义并没有改变,为何它不是window了呢.好吧,这就是函数在 JSavacript中传递的方式,函数在JavaScript里是一个标准的数据类型,确切的说是一个对象.你可以传递它们或者复制他们.就好像整个函 数连带参数列表和函数体都被复制,且被分配给了 arrayMaker里的属性make,那就好像这样定义一个 arrayMaker:

var arrayMaker = { 
   someProperty: 'some value here', 
   make: function (arg1, arg2) { 
       return [ this, arg1, arg2 ]; 
   } 
};JavaScript函数调用规则2 在一个使用方法调用语法,像 obj.myFunction()或者 obj['myFunction'](),这时this的值为obj

这是事件处理代码中bug的主要源头,看看这些例子

<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> 点击第一个按钮将会显示”btn”因为它是一个方法调用,this为所属的对象(按钮元素) 点击第二个按钮将显示”window”因为 buttonClicked是被直接调用的(不像 obj.buttonClicked().) 这和我们第三个按钮,将事件处理函数直接放在标签里是一样的.所以点击第三个按钮的结果是和第二个一样的. 
使用像jQuery的JS库有这样的优点,当在jQuery里定义了一个事件处理函数,JS库会帮助重写this的值以保证它包含了当前事件源元素的引用,

//使用jQuery 
$('#btn1').click( function() { 
   alert( this.id ); // jQuery ensures 'this' will be the button 
});jQuery是如何重载this的值的呢?继续阅读

另外两个:apply()和call() 
你 越多的使用JavaScript的函数,你就越多的发现你需要传递函数并在不同的上下文里调用他们,就像Qjuery在事件处理函数里所做的一样,你往往 经常需要重置this的值.记住我告诉你的,在Javascript中函数也是对象,函数对象包含一些预定义的方法,其中有两个便是apply()和 call(),我们可以使用它们来对this进行重置.

var gasGuzzler = { year: 2008, model: 'Dodge Bailout' }; 
makeArray.apply( gasGuzzler, [ 'one', 'two' ] ); 
// => [ gasGuzzler, 'one' , 'two' ] 
makeArray.call( gasGuzzler, 'one', 'two' ); 
// => [ gasGuzzler, 'one' , 'two' ]这两个方法是相似的,不同的是后面的参数的不同,Function.apply()是使用一个数组来传递给函数的,而Function.call()是 将这些参数独立传递的,在实践中你会发现apply()在大多数情况下更方便.

JSavacript函数调用规则3 如果我们想在不复制函数到一个方法而想重载this的值的时候,我们可以使用 myFunction.apply( obj ) 或 myFunction.call( obj ).

构造器 
我不想深入研究在Javascript中类型的定义,但是在此刻我们需要知道在Javascript中没有类,而且任何一个自定义的类型需要一个初始化函数,使用原型对象(作为初始化函数的一个属性)定义你的类型也是一个不错的主义,让我们来创建一个简单的类型

//声明一个构造器 
function ArrayMaker(arg1, arg2) { 
   this.someProperty = 'whatever'; 
   this.theArray = [ this, arg1, arg2 ]; 

// 声明实例化方法 
ArrayMaker.prototype = { 
   someMethod: function () { 
       alert( 'someMethod called'); 
   }, 
   getArray: function () { 
       return this.theArray; 
   } 
};

var am = new ArrayMaker( 'one', 'two' ); 
var other = new ArrayMaker( 'first', 'second' );

am.getArray(); 
// => [ am, 'one' , 'two' ]一个非常重要并值得注意的是出现在函数调用前面的new运算符,没有那个,你的函数就像全局函数一样,且我们创建的那些属性都将是创建在全局对象上 (window),而你并不想那样,另一个话题是,因为在你的构造器里没有返回值,所以如果你忘记使用new运算符,将导致你的一些变量被赋值为 undefined.因为这个原因,构造器函数以大写字母开头是一个好的习惯,这可以作为一个提醒,让你在调用的时候不要忘记前面的new运算符. 
带着这样的小心,初始化函数里的代码和你在其他语言里写的初始化函数是相似的.this的值将是你将创建的对象.

函数(jquery)的更多相关文章

  1. jQuery源码分析-03扩展工具函数jQuery.extend

    // 扩展工具函数 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控制 ...

  2. jquery的2.0.3版本源码系列(2):21行-94行定义了一些变量和函数 jQuery=function(){}

    2.1.bug通过索引查询 这里的#13335是bug的索引,如何查询呢? 第一步,浏览器地址栏输入"https://bugs.jquery.com/". 第二步,在网页的搜索框里 ...

  3. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  4. 二.jQuery源码解析之构建jQuery之构建函数jQuery的7种用法

    一:$(selectorStr[,限制范围]),接受一个选择器(符合jQuery规范的字符串),返回一个jQuery对象; 二:$(htmlStr[,文档对象]),$(html[,json对象])传入 ...

  5. 自定义动画函数JQuery实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 五、jquery使用工具函数

    工具函数对应的网址在 http://api.jquery.com/categouy/utilities/   工具函数处理对象的不同,可以将其分为几大类别:浏览器的检测.数组和对象的操作.字符串的操作 ...

  7. jquery ajax 前前后后,所有的函数并查询链接

    jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 描述 jQuery.ajax() 执行异步 H ...

  8. jQuery全局函数

    全局函数是对jQuery对象的扩展,其中扩展方法包括: 一,extend扩展: //调用全局函数$(document).ready(function () { $.myFunction(); $.my ...

  9. Jquery核心函数

    在Jquery中,所有的DOM对象都将封装成Jquery对象,而且只有Jquery对象才能使用Jquery方法或者属性来执行相应的操作. 所以Jquery提供了一个可以将DOM对象封装成Jquery对 ...

  10. jQuery Ajax 操作函数及deferred对象

    jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 描述 jQuery.ajax() 执行异步 H ...

随机推荐

  1. android 手势滑动

    1.概述, 两次都是画曲线统计图用到手势滑动.左滑动,右滑动曲线图翻页 2.直接上代码 3.注: 第一次使用的时候是implement了 OnTouchListener 接口,是在画图布局上layou ...

  2. 【写一个自己的js库】 3.添加几个处理字符串的方法

    1.生成重复的字符串 if(!String.repeat){ String.prototype.repeat = function (count){ return new Array(count + ...

  3. C语言的本质(27)——C语言与汇编之计算机结构

    现代计算机都是基于冯·诺依曼或哈佛体系结构的,不管是嵌入式系统.个人电脑还是服务器.这种两种体系结构的主要特点是:CPU和内存是计算机的两个主要组成部分,内存中保存着数据和指令,CPU从内存中取指令执 ...

  4. [Leetcode][Python]47: Permutations II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 47: Permutations IIhttps://oj.leetcode. ...

  5. IOS开发(objective-c)~开篇有理

    自从6月份买了iphone5之后,心里都是觉得不学点IOS开发,始终觉得有点浪费,而且咱还学习C,C++,java,C#,有了这些基础,再不学这个Objective-c确实有点可惜了,所以,说干就干, ...

  6. 【MFC学习笔记-作业7-小型画图软件】【】

    作业要求: 按下鼠标右键画圆. 按下鼠标左键移动曲线. 丝毫没有思路..网上教程又比这个程序复杂100倍... 好吧 总算找到一个合适的了... 转载至:http://blog.chinaunix.n ...

  7. DoNet开源项目-基于jQuery EasyUI的后台管理系统

    博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery EasyUI 后台管理系统布局分享,目前已完成系统的整体框架的搭建 ...

  8. hbase importtsv

    hadoop jar hbase-server-0.98.1-cdh5.1.3.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,cf:imsi,cf:i ...

  9. 学习Oracle一个星期以来的总结

    公司开发部门主要分2部分:.net开发和Oracle PL\SQL开发.刚入职的我被分到Oracle PL\SQL组了.Oracle是比SQL Server更大的数据库应用,我在学校只接触过SQL S ...

  10. Oracle的汉字转拼音首字母的函数

    CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE VARCHAR2(100); ...