第一题:
function f1 ( ) {
var tmp = 1 ;
this . x = 3 ;
console. log ( tmp) ;
console. log ( this . x) ;
}
var obj = new f1 ( ) ;
console. log ( obj. x)
console. log ( f1 ( ) ) ;
分析:这道题让我重新认识了对象和函数,首先看代码(1 ),这里实例话化了 f1这个类。相当于执行了 f1函数。所以这个时候 A 会输出 1 ,
而 B 这个时候的 this 代表的是 实例化的当前对象 obj B 输出 3. 。 代码(2 )就会输出 3 , 重点 代码(3 )首先这里将不再是一个类,
它只是一个函数。那么 A 输出 1 , B 呢?这里的this 代表的其实就是window对象,那么this . x 就是一个全局变量 相当于在外部 的一个全局
变量。所以 B 输出 3 。最后代码由于f没有返回值那么一个函数如果没返回值的话,将会返回 underfined ,所以答案就是 :
1 , 3 , 3 , 1 , 3 , underfined 。
第二题:
var o1 = new Object ( ) ;
var o2 = o1;
o2. name = "CSSer" ;
console. log ( o1. name) ;
如果不看答案,你回答真确了的话,那么说明你对javascript的数据类型了解的还是比较清楚了。js中有两种数据类型,分别是:基本数据
类型和引用数据类型(object Array)。对于保存基本类型值的变量,变量是按值访问的,因为我们操作的是变量实际保存的值。对于保存
引用类型值的变量,变量是按引用访问的,我们操作的是变量值所引用(指向)的对象。答案就清楚了:`CSSer` ;
第三题:
function changeObjectProperty ( o) {
o. siteUrl = "http://www.csser.com/" ;
o = new Object ( ) ;
o. siteUrl = "http://www.popcg.com/" ;
}
var CSSer = new Object ( ) ;
changeObjectProperty ( CSSer) ;
console. log ( CSSer. siteUrl) ;
如果CSSer参数是按引用传递的,那么结果应该是"http://www.popcg.com/" ,但实际结果却仍是"http://www.csser.com/" 。事实
是这样的:在函数内部修改了引用类型值的参数,该参数值的原始引用保持不变。我们可以把参数想象成局部变量,当参数被重写时,这个变量
引用的就是一个局部变量,局部变量的生存期仅限于函数执行的过程中,函数执行完毕,局部变量即被销毁以释放内存。
(补充:内部环境可以通过作用域链访问所有的外部环境中的变量对象,但外部环境无法访问内部环境。每个环境都可以向上搜索作用域链,
以查询变量和函数名,反之向下则不能。)
第四题:
var a = 6 ;
setTimeout ( function ( ) {
var a = 666 ;
alert ( a) ;
} , 1000 ) ;
a = 66 ;
因为var a = 666 ; 定义了局部变量a,并且赋值为666 ,根据变量作用域链,
全局变量处在作用域末端,优先访问了局部变量,从而覆盖了全局变量 。
var a = 6 ;
setTimeout ( function ( ) {
alert ( a) ;
var a = 666 ;
} , 1000 ) ;
a = 66 ;
因为var a = 666 ; 定义了局部变量a,同样覆盖了全局变量,但是在alert ( a) ; 之前
a并未赋值,所以输出undefined。
答案:666 undefined
第五题:
function setN ( obj) {
obj. name= '苹果' ;
obj = new Object ( ) ;
obj. name = '香蕉' ;
} ;
var per = new Object ( ) ;
setN ( per) ;
alert ( per. name) ;
第六题:
function foo ( ) {
foo. a = function ( ) { alert ( 1 ) } ;
this . a = function ( ) { alert ( 2 ) } ;
a = function ( ) { alert ( 3 ) } ;
var a = function ( ) { alert ( 4 ) } ;
} ;
foo. prototype. a = function ( ) { alert ( 5 ) } ;
foo. a = function ( ) { alert ( 6 ) } ;
foo. a ( ) ;
var obj = new foo ( ) ;
obj. a ( ) ;
foo. a ( ) ;
第七题:
var a = 5 ;
function test ( ) {
a = 0 ;
alert ( a) ;
alert ( this . a) ;
var a;
alert ( a)
}
test ( ) ;
new test ( ) ;
最终结果答案:0 5 0 0 undefined 0
第八题:
var foo = "11" + 2 - "1" ;
console. log ( foo) ;
console. log ( typeof foo) ;
执行完后foo的值为111 ,foo的类型为Number。
第九题:
var a = new Object ( ) ;
a. value = 1 ;
b = a;
b. value = 2 ;
alert ( a. value) ;
执行完后输出结果为2
第九题:
< button id= 'btn' > 点击我< / button>
var btn = document. getElementById ( 'btn' ) ;
var handler = {
id: '_eventHandler' ,
exec: function ( ) {
alert ( this . id) ;
}
}
btn. addEventListener ( 'click' , handler. exec) ;
答案:btn,因为handler. exec是由btn这个按钮执行的
第十题:
var obj = { proto: { a: 1 , b: 2 } } ;
function F ( ) { } ;
F . prototype = obj. proto;
var f = new F ( ) ;
obj. proto. c = 3 ;
obj. proto = { a: - 1 , b: - 2 } ;
alert ( f. a) ;
alert ( f. c) ;
delete F . prototype[ 'a' ] ;
alert ( f. a) ;
alert ( obj. proto. a) ;