一、函数声明和表达式

函数声明: 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. 1--Jmeter4.0连接Oracle数据库

    一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...

  2. Oracle密码概要文件,密码过期时间180天修改为3天,相关用户密码是否过期

    #Oracle用户密码,概要文件修改测试 #默认的用户使用概要文件,默认概要文件密码过期时间参数180天,修改为3天,对于老的用户来说,是密码过期,还是未发生改变, 对于新用户来说,新设置的密码过期时 ...

  3. HDU - 5785:Interesting (回文树,求相邻双回文的乘积)

    Alice get a string S. She thinks palindrome string is interesting. Now she wanna know how many three ...

  4. lesson4-图像分类-小象cv

    CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...

  5. jmeter定时器

    一.定时器的作用 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执 ...

  6. freemarker的template用法

    package cn.itcast.ssm.util; import com.alibaba.fastjson.JSONObject; import freemarker.cache.StringTe ...

  7. django 浅谈CSRF(Cross-site request forgery)跨站请求伪造

    浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好) 本文目录 一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 ...

  8. 【状压DP】【HDOJ1074】

    http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (Java/Others) ...

  9. 【单位矩阵】【杭电OJ1575】

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. #366 A-C

    A. Hulk 题意是给你一个n 输出一个英文字符串,找下规律就发现 当(i!=n&&i%2==1) 输出的是 I hate that (注意大写) 当(i!=n&&i ...