JavaScript 函数中的隐式参数

函数中的隐式参数

在函数调用的时候,浏览器每次都会传递进两个隐式参数:

函数的上下文对象this

this对象是在运行时基于函数的执行环境绑定的:

  • 在全局环境中,this等于window
  • 当函数被作为某个对象的方法调用时,this等于那个对象。
  • 匿名函数的执行环境具有全局性,因此其this对象通常指向window。
  • 每个函数都有自己的执行环境。全局执行环境是最外围的一个执行环境。this指向的就是当前代码所在的执行环境。
// 定义一个全局变量
var type = "全局"; 
 
// 定义函数aa
function aa () {
	var type = '局部';
	console.log(this.type);
}
aa(); // "全局"
 
// 定义对象bb
var bb = {
	type: '局部',
	getType: function () {
		console.log(this.type)
	}
};
bb.getType(); // “局部”
 
// 定义对象cc
var cc = {
	type: '局部',
	getType: function () {
		return function () {
			return this.type
		}
	}
};
cc.getType(); // “全局”(非严格模式下)
  • 第一个例子,aa函数运行在全局环境中,所以this指向window。
  • 第二个例子,bb是一个对象,调用bb的getType方法,getType的运行环境在bb对象中,this指向bb。
  • 第三个例子,同bb对象,不同的是cc的getType方法返回的是一个匿名函数,匿名函数中又返回this.type。为什么this并没有像bb中一样指向bb,这个和JS的活动对象有关。每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索其活动对象为止,活动对象为当前所在执行环境的变量对象,当前所在的执行环境是一个立即执行的匿名函数,变量对象里并没有this.type,所以this还是指向window。

封装实参的对象arguments


例子:

function fun(){
  console.log(arguments);
}
fun('tom',[1,2,3],{name:'guixi'}); 

可以通过arguments来调用传递给函数fun的实参。
在这里插入图片描述

  • arguments还有属性callee,length和迭代器Symbol。

  • callee的值是函数fun,callee指向函数fun

function fun(){
  // console.log(arguments);
  console.log(arguments.callee === fun);
  //true [callee指向函数fun]
}
fun('tom',[1,2,3],{name:'guixi'});
  • 第二个属性length,我们经常在数组或者类数组中看到,
  • arguments的原型索引__proto__的值为Object,arguments不是数组,而是一个类数组对象。
  • 第三个属性是个Symbol类型的键,该类型的值都是独一无二的,该键指向的值是一个values函数,
    该值是一个生成迭代器的函数,下面是ES6入门的部分文档。

关于Symbol.iterator
https://blog.csdn.net/margin_0px/article/details/82971545

let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();

iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
//在arguments中有同样的效用。
function fun(){
  console.log(arguments[Symbol.iterator]);
  let iterator = arguments[Symbol.iterator]();
  console.log('iterator:',iterator);
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
}
fun('tom',[1,2,3],{name:'guixi'});

打印结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值