一、函数声明和表达式

函数声明: function test() {};

test();    //运行正常

function test() {};

函数表达式: var test = function() {};

test;    //undefined

test();   //TypeError

var test = function() {};

命名函数的赋值表达式:

var test = function bar() {

test();    //正常运行

};

test();    //ReferenceError

二、this

1. 全局范围内、函数调用、方法调用、调用构造函数、显示的设置this;

注:在严格模式下,没有全局变量,即this = undefined,在对象的字面量声明语法中,this不能用来指向对象本身;

显示的设置this:

function test(a, b, c) {};

var bar = {};

foo.apply(bar, [1, 2, 3]);   //数组将被扩展;

foo.call(bar, 1, 2, 3);   //传递到test的参数为: a = 1, b = 2,c = 3;

当使用Function.prototype上的call或apply方法时,函数内的this将被显示设置为函数调用的第一个参数;

2. 常见误解

1. Foo.method = function() {

  function test() {

    //this 为全局变量;

  };  

  test();

};

Foo.method = function() {

  var that = this;

  function test() {

    //that指向Foo对象;

  };

  test();

};

三、闭包和引用

闭包:当前作用域总是能访问外部作用域中的变量。

例:

function counter(start) {

  var count = start;

  return {

    increment: function() {

      count++;

    },

    get: function() {

      return count;

    }

  };

};

var test = counter(4);

test.increment();

test.get();    //5;

循环中的闭包:

for (var i = 0; i < 10; i++) {

  setTimeout(function() {

    console.log(i);   // 10个10;

  }, 1000);

};

方法:

1. for (var i = 0; i < 10; i++) {

  (function(e) {

    setTimeout(function() {

      console.log(e);   // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

    }, 1000);

  })(i);

};

2. for (var i = 0; i < 10; i++) {

  setTimeout(function(e) {

    return function() {

      console.log(e);    //0, 1, 2, 3, 4, 5, 6, 7, 8, 9

    };

  }(i), 1000);

};

四、arguments对象

每个函数内都可以访问一个变量arguments,它维护着所有传进来的参数列表,不是一个数组,不能用pop()、push()等数组方法,但是能访问其length;

注:当arguments作为局部变量声明和形参时,arguments对象不会被创建;

注:强烈建议不要使用arguments.callee;

转换为数组:Arrary.prototype.slice.call(arguments);但转化比较慢,不咋推荐;

arguments会创建getter和setter方法,改变形参的值会改变arguments对象的值,反之亦然;

例:

function test(a, b, c) {

  arguments[0] = 10;

  console.log(a);    //10;

  b = 20;

  console.log(arguments[1]);   //20;

  var d = c;

  d = 9;

  console.log(c);  //3;

};

test(1, 2, 3);

function test(a) {

  'use strict';

  a = 10;

  console.log(a, arguments[0]);  //10, 1

};

test(1);

五、函数间传递参数

1. function foo() {

  test.apply(null, argument);

};

function(a, b, c) {};

2. 同时使用call和apply:

function Foo() {};

Foo.prototype.method = function(a, b, c) {

  console.log(this, a, b, c);

};

Foo.method = function() {

  Foo.call.apply(Foo.prototype.method, arguments);

};

或者:

Foo.method = function() {

  var args = Array.prototype.slice.call(arguments);

  Foo.prototype.method.apply(args[0], args.slice[1]);

};

JavaScript学习总结(三、函数声明和表达式、this、闭包和引用、arguments对象、函数间传递参数)的更多相关文章

  1. JavaScript学习记录三

    title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  2. Javascript 函数声明、调用、闭包

    1 # Javascript 函数声明.调用.闭包 2 # 一.函数声明 3 # 1.直接声明.浏览器在执行前,会先将变量和函数声明进行提升. 4 fn(); 5 function fn () { 6 ...

  3. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  4. javascript Arguments对象——函数的实际参数

    在javascript函数体内,标识符arguments具有特殊含义.它是调用对象的一个特殊属性,用来引用Arguments对象.Arugments对象就像数组,注意这里只是像并不是哈. javasc ...

  5. JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  6. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  7. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  8. JS函数声明与定义,作用域,函数声明与表达式的区别

    Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); 上面这 ...

  9. JavaScript学习第三天

    今天学习第三天. 凡事都是需要坚持的,坚持下去. 学习内容: 1.document.getElementById(""),document.getElementByTagName( ...

随机推荐

  1. table中head表头固定,body滚动

    <style type="text/css"> .table-head { background-color: #; color: #; } .table-body { ...

  2. OpenID

    OpenId是一个以用户为中心的数字身份识别框架,它具有开放.分散.自由等特性.OpenId的创建是基于这样一个概念:我们可以通过URI(或者URL网址)来识别一个网站.同样,我们也可以通过这样的方式 ...

  3. SQL注入之Sqli-labs系列第二十一关(基于复杂性的cookie POST报错注入)和二十二关(基于双引号的cookie POST报错注入)

    开始挑战第二十一关(Cookie Injection- Error Based- complex - string) 和二十二关(Cookie Injection- Error Based- Doub ...

  4. Spring Boot 揭秘与实战(二) 数据存储篇 - 数据访问与多数据源配置

    文章目录 1. 环境依赖 2. 数据源 3. 单元测试 4. 源代码 在某些场景下,我们可能会在一个应用中需要依赖和访问多个数据源,例如针对于 MySQL 的分库场景.因此,我们需要配置多个数据源. ...

  5. 查看Windows端口及端口关闭方法

    一.查看已开放的端口: 1.借助系统自带MS-DOS命令查看开放的端口(Win2000/XP/server2003) 在开始-运行-输入cmd,打入netstat -an(注意-前有个小空格),在IP ...

  6. 【02_258】Add Digits

    Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...

  7. CF446 (Div. 1)简单题解

    A .DZY Loves Sequences pro:给定长度为N的序列,你最多可以改变一个数的值,问最长严格上升子序列长度. N<1e5. sol:分几种情况,一种的不改变: 一种是改变,然后 ...

  8. python scrapy 爬虫实例

    1 创建一个项目 scrapy startproject basicbudejie 2 编写爬虫 import scrapy class Basicbudejie(scrapy.Spider): na ...

  9. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  10. Maven命令安装jar包到本地仓库

    https://blog.csdn.net/moxiong3212/article/details/78767480 当需要的jar包在中央仓库找不到或者是想把自己生成的jar包放到的Maven仓库中 ...