JavaScript学习总结(三、函数声明和表达式、this、闭包和引用、arguments对象、函数间传递参数)
一、函数声明和表达式
函数声明: 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对象、函数间传递参数)的更多相关文章
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- Javascript 函数声明、调用、闭包
1 # Javascript 函数声明.调用.闭包 2 # 一.函数声明 3 # 1.直接声明.浏览器在执行前,会先将变量和函数声明进行提升. 4 fn(); 5 function fn () { 6 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- javascript Arguments对象——函数的实际参数
在javascript函数体内,标识符arguments具有特殊含义.它是调用对象的一个特殊属性,用来引用Arguments对象.Arugments对象就像数组,注意这里只是像并不是哈. javasc ...
- JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JS函数声明与定义,作用域,函数声明与表达式的区别
Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); 上面这 ...
- JavaScript学习第三天
今天学习第三天. 凡事都是需要坚持的,坚持下去. 学习内容: 1.document.getElementById(""),document.getElementByTagName( ...
随机推荐
- 1--Jmeter4.0连接Oracle数据库
一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...
- Oracle密码概要文件,密码过期时间180天修改为3天,相关用户密码是否过期
#Oracle用户密码,概要文件修改测试 #默认的用户使用概要文件,默认概要文件密码过期时间参数180天,修改为3天,对于老的用户来说,是密码过期,还是未发生改变, 对于新用户来说,新设置的密码过期时 ...
- HDU - 5785:Interesting (回文树,求相邻双回文的乘积)
Alice get a string S. She thinks palindrome string is interesting. Now she wanna know how many three ...
- lesson4-图像分类-小象cv
CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...
- jmeter定时器
一.定时器的作用 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执 ...
- freemarker的template用法
package cn.itcast.ssm.util; import com.alibaba.fastjson.JSONObject; import freemarker.cache.StringTe ...
- django 浅谈CSRF(Cross-site request forgery)跨站请求伪造
浅谈CSRF(Cross-site request forgery)跨站请求伪造(写的非常好) 本文目录 一 CSRF是什么 二 CSRF攻击原理 三 CSRF攻击防范 回到目录 一 CSRF是什么 ...
- 【状压DP】【HDOJ1074】
http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (Java/Others) ...
- 【单位矩阵】【杭电OJ1575】
Tr A Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- #366 A-C
A. Hulk 题意是给你一个n 输出一个英文字符串,找下规律就发现 当(i!=n&&i%2==1) 输出的是 I hate that (注意大写) 当(i!=n&&i ...