1.javascript中函数有两种定义方式:

函数语句定义和表达式定义

  1. //函数有定义
  2. function test(){
  3. console.log("This is a function");
  4. }
  5.  
  6. //表达式定义
  7. var f = function(a){
  8. return Math.sqrt(a);
  9. };

2.函数调用方式有以下四种:

1)作为函数

2)作为方法

3)作为构造函数

4)通过它们的call()和apply()方法间接调用

3.关键词this没有作用域的限制,不是变量,也不是属性名,是一个关键字。

如果嵌套函数作为方法调用,其this的值指向调用它的对象;如果嵌套函数作为函数调用,其this值不是全局变量(非严格模式下)就是undefined(严格模式下)。

  1. var o = {
  2. m: function(){
  3. var self = this;
  4. console.log(this); //this代表o
  5. f();
  6.  
  7. function f(){
  8. console.log(this); //this代表全局对象或者undefined
  9. console.log(self); //self代表o
  10. }
  11. }
  12. }

4.闭包

闭包的概念:是指函数变量可以被隐藏于作用域内,因此看起来是函数将变量包裹起来。

百度的闭包定义:闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。

Javascript采用词法作用域,也就是说,函数的执行依赖于变量的作用域。这个作用域是在函数定义时决定的,而不是在函数调用时决定的。

理解闭包首先要了解嵌套函数的词法作用域规则:

  1. var scope = "global scope";
  2. function checkscope(){
  3. var scope = "local scope";
  4. function f(){
  5. return scope;
  6. }
  7. return f();
  8. }
  9.  
  10. checkscope(); //返回local scope

修改一下上述代码:

  1. var scope = "global scope";
  2. function checkscope(){
  3. var scope = "local scope";
  4. function f(){
  5. return scope;
  6. }
  7. return f;
  8. }
  9.  
  10. checkscope()(); //返回local scope

为什么上述代码也返回local scope呢?

Javascript函数的执行用到了作用域链,这个作用域链是函数定义的时候创建的,嵌套函数f()定义在这个作用域链例里,其中的变量scope一定是局部变量。不管在何时何地执行函数f(),这种绑定在执行f()时依然有效。

这就是闭包的特性导致的。函数定义时的作用域链到函数执行时依然有效,这也是词法作用域规则。

闭包的这个特性可以捕获到局部变量(和参数),并一直保存下来,看起来像这些变量绑定到了在其中定义它们的外部函数。

关于作用域链的补充:

定义:每一段Javascript代码(全局代码或函数)都有一个与之关联的作用域链。作用域链可以描绘成是一个对象列表或者链表,这组对象定义了这段代码作用域中的变量。

每次调用Javascript的时候,都会为之创建一个新的对象来保存局部变量,把这个对象添加到作用域链中。当函数返回的时候,就从作用域链中将这个绑定变量的对象删除。如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,它就会被当做垃圾回收掉。如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些嵌套的函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾回收。但是如果这个函数定义了嵌套函数,并且将它作为返回值返回或者保存在某处的属性中,这是就会有一个外部引用指向这个嵌套的函数。它就不会被当做垃圾回收,并且它所指向的变量绑定对象也不会被当做垃圾回收掉。

下面是利用闭包技术共享私有状态的方法:

  1. function addPrivateProperty(o,name,predicate){
  2. var value; //这是一个属性
  3.  
  4. //getter方法简单地将其返回
  5. o["get" + name] = function(){return value;}
  6.  
  7. //setter方法首先检查值是否合法,若不合法就抛出异常
  8. //否则就将其存储起来
  9. o["set" + name] = function(v){
  10. if(predicate && !predicate(v)){
  11. throw Error("set" + name + ":invalid value " + v);
  12. }else{
  13. value = v;
  14. }
  15. };
  16. }
  17.  
  18. //下面展示了addPrivateProperty()方法
  19. var o = {}; // 设置一个空对象
  20.  
  21. //增加属性存取方法getName()和setName()
  22. //确保只允许字符串值
  23. addPrivateProperty(o, "Name", function(x){return typeof x == "string";});
  24.  
  25. o.setName("Frank"); //设置属性
  26. console.log(o.getName()); //得到属性
  27. o.setName(o); //试图设置一个错误类型的值

利用闭包定义函数,进行缓存记忆:

  1. function memorize(f){
  2. var cache = {};
  3. return function(){
  4. var key = arguments.length + Array.prototype.join.call(arguments,",");
  5. if(key in cache) return cache[key];
  6. else return cache[key] = f.apply(this,arguments);
  7. }
  8. }

javascript基础知识-函数的更多相关文章

  1. javascript基础知识--函数定义

    函数声明式 function funname( 参数 ){ ...执行的代码 } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行JavaScript语 ...

  2. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  3. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  4. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  5. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  6. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

  7. JavaScript基础知识:数据类型,运算符,流程控制,语法,函数。

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...

  8. (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识

    开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...

  9. JavaScript基础知识整理

    只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...

随机推荐

  1. mvc 项目下 webservice 程序无法运行

    错误描述: 可以出现调用HelloWorld的界面 点击调用按钮报无法找到该资源 错误分析: 把webservice当成controller了. 解决: global中 添加  routes.Igno ...

  2. php 快速排序

    快速排序是以其中一个数为比较标准,其他比较的数分块处理,应用递归按相同想法处理数据 比如:4 3 6 2 1 7 8 以4为比较对象 排序为 3 2 1 6 7 8 左边为 3 2 1 右边 为 6 ...

  3. 使用Maven自动部署Java Web应用到Tomcat服务器

    学习如何使用Maven,我推荐一本工具书,<maven the definitive guide>.在这本工具书手中,详细介绍了maven的使用思想,并且提供了从基本到复杂的具体项目应用. ...

  4. 用CSS3在手机上写弹出框,遮盖层

    html: 在页面头部要写 <title>网上预约</title> <link href="../App_Themes/default/css/header.c ...

  5. Symmetric Difference

    function sym(args) { //return args; var arr = []; for(var i = 0; i < arguments.length; i++){ arr. ...

  6. 由Struts return SUCCESS引发的基础问题

    该问题的最初来源,是源于Struts中的 return SUCCESS; 和 return "success"; 在Struts的配置文件struts.xml我们可以找到" ...

  7. C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)

    using System; using Microsoft.Office.Core; namespace Office { class Util { private Util() { } /// &l ...

  8. 腾讯OAuth授权联合登录

    /** * unionLoginCallbackPath */ @Value("${QQ_UNION_LOGIN_CALLBACK_PATH}") private String q ...

  9. 我所理解的SoC

    前阵子出去找工作,有的人不太理解,你们SoC有什么可做的,不就是找几个IP来搭积木嘛.你那个FPGA prototyping有什么可做的,不就是编一个镜像嘛. 正好,新项目,重新开始做一颗SoC.接下 ...

  10. tmp

    Hello 大家好,这次给大家带来的是Gear VR4代,首先我得感谢下我们的虎友Hide兄弟友情提供Gear给我们测评,感谢 感谢.之前我录的前哨战也说过,这次Gear VR 4代较3代变化并不是很 ...