
这是一个文字表述起来很麻烦的问题,解释之前先记住一下几点:
Point 1 : 使用 var 声明一个变量,变量声明会被提前到作用域最的最前面,也就是说无论你在什么地方 var 一个变量,这个变量都在代码一开始就被声明了,在函数内声明的变量也是如此
Point 2:所有的函数在被当做函数执行的时候,this 都指向 window(global),ES6除外
然后说你的那段代码:
定义了一个全局的 num = 1;
定一个 obj,并且有一个属性 num = 2
obj 有一属性 fn,fn 的值是通过自动执行函数返回的 function
自动执行函数构成了一个闭包
以上是几个关键的点,下面解释一下 fn :
根据 上文 Point 1 和 Point 2 来看,实际上 fn 的代码等价于下面的代码:
fn : ( function() {var num; // 根据 Point 1,num 在函数中的声明被提到最前
windownum += 10; // 根据上文 Point 2,函数在自动执行过程中,this 指向的是 global
num = num + 10; // num 被声明,但是没有赋值,所以 num == undefined,所以 num + 10 会是 NaN
num = 3; // num 被赋值为 3
return function() {
thisnum += 10;
num++; // 这个作用域内没有 num,但是因为形成了闭包,所以这个 num 是外层函数的 num,就是被赋值成了 3 的那个。
consolelog( num );
}
} )()
下面看你执行的代码:
var fn=objfn; fn();
num 初始值是3, 所以 num++ 是 4,同时 fn 被以普通函数来执行,所以里面的 this 指向 window,thisnum 改变的是最外层 num 的值,最外层的 num 这时候等于 21 了(在函数自动执行的时候还 + 过10)。
objfn();
再执行一次 num++ 值是 5,fn 是被作为 obj 的属性执行的,所以 fn 里面的 this 指向的是 objnum,所以 objnum 等于 12
consolelog( num );
这个 num 是最外层的 num。
consolelog( objnum );
这个没什么需要说的了。
1arguments,伪数组,包含函数中所有的参数
2函数如果不给任何条件,那么this默认指向window
3如果要指定this就通过call来传this
fncall(1)
如果传的this不是对象,那么js会自动帮忙封装为对象
这时的this是1对象
如何声明的时候不转化为对象呢
function fn(){
'use strict'
consolelog(this)
}
fncall(1),this就是1
fcall(1,2,3,4)
此时对象1就是this,234就是arguments
4this是隐藏参数,arguments是显示参数
5let person={
name:'frank',
sayHi(){
consolelog("你好,我叫"+personname)}
}
我们可以用直接保存了对象地址的变量获取name
这种方法称为引用:变量保存了对象的地址
6js在每一个函数都加上一个this,用this获取目前还不知道名字的对象
7call指定this
fncall(this,参数1,参数2)
这是jquery的插件,(function($){})应该是(function($){})(jQuery),也就是把jQuery对像传进函数里面去,用$表示,以防外部的$被误改变或jquery指定不能用$时(兼容其它框架),而造致jquery功能的失效。和$(function(){})是两回事,这个是执行一个匿名函数
$fnwBox就是jquery自定义的功能,等同于$prototypewBox,后面跟的是参数,用的是json对象。
用jQuery自带方法/函数来获取outerHTML属性的方法:
1、定义方法outerHTML:
jQueryfnouterHTML = function(s) {
return s
thisbefore(s)remove()
: jQuery("<p>")append(thiseq(0)clone())html();
};
2、举例如下:
有如下html标签:<div id="xxx"><p>Hello World</p></div>获取Hello World的方法:
outerHTML('<p>Hello World</p>');
3、输出结果:
Hello World
function fn1(obj){
var $li = $(obj)parent();
var spclass = $lidata("spclass");
}
以上就是关于关于javascript里面的this,下面函数的执行结果是怎么得来的全部的内容,包括:关于javascript里面的this,下面函数的执行结果是怎么得来的、JS中的arguments和this、js中的$.fn.wBox是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)