Javascript函数小结(一)

  1. 函数是一个可以被调用和执行任意次的程序片段。JavaScript函数是参数化的:函数的定义会包括一个称为形参的标识符列表,这些参数在函数体中像局部变量一样工作。函数调用会为形参提供实参的值。函数使用它们实参的值来计算返回值。函数使用它们实参的值来计算返回值,成为该函数调用表达式的值。除了实参之外,每次调用还会拥有另一个值——本次调用的上下文——这就是this关键字的值。
  2. 如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文。也就是该函数的this的值。用于初始化一个新创建的对象的函数称为构造函数。
  3. 函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被在它定义之前的代码所调用。不过,以表达式声明的函数就另当别论了,为了调用一个函数,必须要能引用它,而是用一个以表达式方式定义的函数之前,必须把它赋值给一个变量。变量的声明提前了,但给变量赋值是不会提前的,所以,以表达式方式定义的函数在定义之前无法调用。
  4. 根据ECMAScript3和非严格的ECMAScript5对函数调用的规定,调用上下文(this的值)是全局对象。然而在严格模式下,调用上下文则是undefined。
  5. 函数和方法的区别:函数是普通定义的函数,而方法则是对象的函数属性。
  6. 函数调用和方法调用有一个重要的区别,即调用上下文。属性访问表达式由两部分组成,一个对象和属性名称。在这种调用方式中,对象成为调用上下文,函数体可以使用关键字this引用对象。
  7. this是一个关键字,Javascript语法不允许对this赋值。
  8. 方法链:当方法的返回值是一个对象,这个对象还可以再调用它的方法。这种方法调用序列中(通常称为“链”或“级联”)每次的调用结果都是另外一个表达式的组成部分。当方法并不需要返回值时,最好返回this。如果在设计API中一直采用这种方式(每个方法都返回this),使用API就可以进行“链式调用”风格代码的编程,在这种编程风格中,只要指定一次要调用的对象即可,余下的方法都可以给予此进行调用。
  9. 和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下)就是undefined(严格模式下)。很多人误以为调用嵌套函数时this会指向调用外层函数的上下文。如果你想访问这个外部函数的this值,需要将this的值保存在一个变量里,这个变量和内存函数都同在一个作用域内。通常用self来保存this,eg:深入理解this上下文的切换

1)首先看程序的运行结果:

2)然后跟踪js解析执行的过程:变量声明提前

3)变量赋值

4)函数执行

5)第一个相等判断

6)执行到函数内部

那为什么此处this发生了变换呢?我们可以这样理解,函数是一个程序片段,一旦执行完,没用的东西就由GC(垃圾回收)收回,当执行内部嵌套函数时,首先执行子函数中函数定义,变量声明语句,一旦发现父级的变量在子函数中仍然被调用,则有一个变量重新指向父函数中变量的地址,然后清理父级变量对原有资源(包括变量和函数)的引用,最后只剩下子函数中引用的全局变量被报保留(这就是闭包),因此这时就相当于子函数裸漏在外边,因此也就很容易为什么此时this指向Window了。

时间: 2024-10-08 04:14:05

Javascript函数小结(一)的相关文章

Javascript函数小结(二)

构造函数通常不使用return关键字,它们初始化新对象,当构造函数的函数体执行完毕时,它会显示返回.在这种情况下,构造函数调用表达式的计算结果就是这个新对象的值.然而如果构造函数显示地使用return语句返回一个对象,或者返回一个原始值,那么这是将忽略返回值,同时使用这个新对象作为调用结果. callee和caller:实参对象(arguments)的两个属性,在ECMAScript5严格模式中,对这两个属性的读写操作都会产生一个类型错误.前者指代当前正在执行的函数.caller是非标准的,但大

JavaScript 函数作用域的“提升”现象

在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的.例如 : message = "hello JavaScript ! " 即定义了一个全局变量message,并赋值 "Hello JavaScript!"--<JavaScript高级程序第三版> 如同往日一般,一群人在所谓的技术交流群里面相互斗图着.突然老王莫名的正经起来,在群里发了一道JavaScript的题目,让大家猜一猜这道题的答案. v

Javascript数组小结

Javascript数组小结 Javascript将指定的数字索引值转换成字符串--索引值1变成"1"--然后将其作为属性名来使用. 数组的length修改后,数组中大于设定值的元素将被删除 数组的添加删除: 1)  修改length属性值(删除) 2)  push.pop在数组的尾部进行插入.删除操作并返回操作元素:unshift和shift()在数组的首部进行插入.删除操作 3)  delete可以删除数组元素,但它不会改变数组的length属性,只是将该值置空. 4)  spli

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo 前言 在JS学习中,对于原生的很多东西我理解得并不透彻.但是使用jQuery来操作DOM,基本上还是非常熟练的.但是对于AJAX数据交互的处理,我不是很理解. 近期团队交给我一个后端全接口提供给我的项目.我要利用这些接口来自己组织前端代码.为了学习,我决定不使用VUE或者其他的前端框架来做.而是只使用jQuery框架,数据的部分全部使用拼接字符串的形式实现. 获取数据,显示数据,提交数据. 在这个项目中(

ABP展现层——Javascript函数库

ABP展现层——Javascript函数库 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ASP.NET Boil

C#实现百度地图附近搜索&amp;调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1). 声明提前问题 函数声明语句   :声明与函数体一起提前 函数定义表达式 :声明提前,但是函数体不会提前 请看下面图示:绿色线上面实在js初始加载的时候,查看

HTML 学习笔记 JavaScript (函数)

函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> function myFunction() { alert("Hello World!"); } </script> </head> <body> <button onclick="myFunction()">点击这里</b

javascript 函数重载 overloading

函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function overloading or method overloading is the ability to create multiple methods of the same name with different implementations. Calls to an overloaded functi