今天给各位分享javascript严格模式this的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、JS中为什么object中,this指向window?2、JAVASCRIPT中的this到底是谁3、在严格模式下进行javascript有什么好处4、在javascript中,function里this的指向是怎样的?5、javascript严格模式下有哪些不同6、[JS] 先bind后new,this的指向
JS中为什么object中,this指向window?
刚开始学,很容易对javascript中的this搞得晕头转向,因为它指向谁,取决于它所在的地方。
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象。
在函数中,this 表示全局对象,在严格模式下,this 是未定义的(undefined)。
在事件中,this 表示接收事件的元素。
类似 call() 和 apply() 方法可以将 this 引用到任何对象。
你这个例子里就属于单独使用,所以这里的this代表的是全局对象,浏览器环境下就说window了。
把你的例子稍微改一下:
var obj = {
a: 20,
b: function(){ return this.a+= 10 }
}
这时候执行 obj.b(),就发现这里的this指向的是obj了,也就算上述的第一条。关于this的指向要多练习,多思考,因为它确实乱糟糟,所以在ES6中出现了箭头函数,缓解了这个噩梦。
JAVASCRIPT中的this到底是谁
全局对象
在全局执行上下文(函数之外),this引用的是全局对象.
函数
在函数里面,this这个值,得看怎么来调用这个函数
.没有申明为严格模式下,this必须要有一个值去赋予.默认情况下就是指向的是全局对象
严格模式下, this没有被申明,则为undefined.他也可以是任何值,比如null或者42或者其他.
当一个函数作为一个对象的方法去调用,this指向的是对象本身.
对象原型链中的this 是继承的原型类对象
在严格模式下进行javascript有什么好处
非严格模式下有些写法其实是不大符合逻辑的,比如不用var来声明变量就算是个全局变量就可以直接用这种。
严格模式与非严格模式的区别在于以下几点
1,全局变量的显示声明
2,严格模式限制了动态绑定,比如禁止使用with,创设eval的单独作用域
3,严格模式下让你头痛的this关键字不能指向全局变量了
4,不能重名:对象不能有重名属性,方法不能有重名形参
5,对于arguments的限制,严格模式下不能对其赋值了,也不再跟踪参数的变化,arguments.callee也不允许使用
6,函数必须声明在顶层,不允许在非函数代码块内声明函数
严格模式还有一个作用就是为以后JS的标准化做铺垫。严格模式下多了很多关键字如public private如果你懂JAVA,或C#你会明白这是什么意思
在javascript中,function里this的指向是怎样的?
Javascript中一个函数的this关键字的行为相对其它语言有些不同。在严格模式和非严格模式间也有区别。
在大多数情况下,this的值由函数如何调用来决定。this值不能在函数执行过程中赋值设置,并且每次函数调用时this值可能也不相同。ES5通过添加bind方法设置函数的this值,无论函数如何被调用。(this值永久不变)
全局上下文中:
全局执行环境中(函数外部),无论在与不在严格模式下this指向全局对象。
console.log(this.document === document); //true
//在web浏览器中,window对象即是全局对象:
console.log(this === window); // true
this.a=37;
console.logn(window.a); //37
function上下文
在函数内部,this值依赖于函数如何调用。
简单调用:
function f2(){
“use strict”;//使用严格模式
return this;
}
f2() === undefined;
javascript严格模式下有哪些不同
严格模式声明:“use strict”;
1、禁止变量未声明就赋值
2、限制动态绑定(属性和方法归属哪个对象在编译阶段就要确定)
1)禁止使用with
2)创建eval作用域,eval内声明的变量外部访问不到
3、增强的安全措施
1)禁止this关键字指向全局对象
2)禁止在函数内部遍历调用栈(函数内访问functionName.caller/functionName.arguments均报错)
4、禁止删除变量(只有configurable设置为true的对象属性才能被删除)
5、对只读属性赋值将会报错
6、重名错误
1)函数参数不能重名
7、禁止以零(0)开头的8进制表示法,支持数字0加字母o:“0o”为前缀表示八进制数
8、arguments的限制
1)arguments本身不能被赋值 ,但是arguments[x]仍然可以
2)arguments不再追踪参数的变化,在函数内改变参数值,arguments依然指向旧值
3)禁止使用arguments.callee,匿名函数无法调用自己了
9、函数必须在顶层声明
10、不允许使用以下保留字做变量名
1)implements
2)interface
3)let
4)package
5)private
6)protected
7)public
8)static
9)yield
[JS] 先bind后new,this的指向
非严格模式下,以下调用方式中, this 绑定为全局对象 window ,
而在严格模式下, this 绑定为 undefined 。
值得注意是的,只有 this 处于严格模式中,才会绑定为 undefined ,
与 f 被调用的位置是否处于严格模式无关。
可见 new 对 this 的影响比 bind 优先级要高,
g 虽然通过 bind 绑定了 this 指向的对象为 {a:1} ,
但是使用 new g 调用的时候, this 仍然指向以 f 为构造函数的实例。
值得注意的有两点,
(1) bind 之后, g.prototype 为 undefined 。
(2) new g 返回的对象 obj ,使用 instanceof 判断 f 和 g 都为 true ,
原因就在于, V instanceof target 首先会先用 target[Symbol.hasInstance](V) 来判断,
然后再判断, target.prototype 是否在 V 的原型链上,参考 ECMAScript Language Specification
但是 bind 的柯里化作用还是有用的,
使用 call 或者 apply ,将 this 绑定为 null 或 undefined 并不会凑效,
此时, this 将绑定为全局对象。
然而,在严格模式下, this 将绑定为 null 或 undefined ,
值得一提的是,在非严格模式下, f.call(1); 会自动将 1 包装成 new Number(1) ,
然后 this 指向的是这个包装对象。
而在严格模式下, f.call(1); 会将 this 绑定为 1 。
b={} 相当于 b=new Object ,因此, b 是 Object 构造函数的实例。
而 Object.create(null) 会创建一个空对象,它没有原型。
注意, Object.create(undefined); 会报错,
赋值表达式的返回值是函数的引用,因此相当于 f() ,
而不是 obj1.f() ,也不是 obj2.f() 。
你不知道的JavaScript(上卷)
关于javascript严格模式this和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。