问题1:作用域
(function() { var a = b = 5; })(); console.log(b); // 非严格状态显示 5 // a 是局部变量,b 是全局变量 // 严格状态显示 b is not defined (function() { ‘use strict‘; var a = window.b = 5; })(); console.log(b) // 严格状态下显示 5
问题2:创建“内置”方法
window.onload = function(){ var str = "hello"; var oText = document.getElementById(‘text‘); // Javascript的继承及原型属性的知识,下面这个方法可以检测在自己定义函数之前有没有这个函数存在,避免重复定义 String.prototype.repeatify = String.prototype.repeatify || function(times){ var str = ‘‘; for(var i=0;i<times;i++){ str += this; } return str; } oText.innerHTML = str.repeatify(3); }
问题3:声明提前
window.onload = function(){ function test(){ console.log(a); console.log(foo()); var a=1; function foo(){ return 2; } } test(); } // 上面这段代码相当于下面这段代码 window.onload = function(){ function test(){ var a; function foo(){ return 2; } console.log(a); console.log(foo()); a = 1; } test(); }
问题4:Javascript中的this
window.onload = function(){ var fullname = ‘John Doe‘; var obj = { fullname:‘Colin lhrig‘, prop:{ fullname:‘Aulia De Rose‘, getFullname:function(){ return this.fullname; } } } var oText = document.getElementById(‘text‘); oText.innerHTML = obj.prop.getFullname(); } // 显示结果为 Aulia De Rose var test = obj.prop.getFullname; oText.innerHTML = test(); // 显示结果为 John Doe
Javascript中关键字this所指代的函数上下文,取决于函数是怎样被调用的,而不是怎么被定义的。在第一个console.log(),getFullname()被作为obj.prop对象被调用。因此,当前的上下文指代后者,函数返回这个对象的fullname属性。相反,当getFullname()被赋予test变量,当前的上下文指代全局变量window,这是因为test被隐形的作为全局变量的属性。基于这一点,函数返回window的fullname。
问题5: call()和apply()
window.onload = function(){ var fullname = ‘John Doe‘; var obj = { fullname:‘Colin lhrig‘, prop:{ fullname:‘Aulia De Rose‘, getFullname:function(){ return this.fullname; } } } var oText = document.getElementById(‘text‘); oText.innerHTML = obj.prop.getFullname(); } // 显示结果为 Aulia De Rose var test = obj.prop.getFullname; oText.innerHTML = test.call(obj.prop); // 显示结果为 Aulia De Rose
call() 或者 apply()方法可以强制转换上下文
时间: 2024-10-27 10:20:38