函数相关面试题

一、
在javascript中,(B)变量在函数外声明,并可从脚本的任意位置访问
A.局部
B.全局
C.typeOf
D.New

1.局部变量 一般定义在函数体内,有函数作用域,外部不能访问内部局部变量。
2.全局变量,在任何函数之外声明的变量,而全局变量在任意函数中都是可见的。
3.typeof 判断变量数据类型
4.new用于创建一个实例化对象

二、
以下对call() 和 apply() 说法哪些是正确的 (ABCD)
A.apply()函数有两个参数:第一个参数是上下文,第二个参数是参数组成的数组;
B.如果第一个参数是null,则使用全局对象代替;
C.call和apply的意思一样,只不过是参数列表不一样.
D.通过apply可以将数组装换为参数列表的集合

apply,call,bind的用法和区别(方法劫持)
用途:手动改变this的指向
区别:1.apply和call会使当前函数立即执行,bind会返回一个函数,后续需要时再调用
2. call是apply的语法糖,只有传的参数不同,call中要传多个任意参数,apply只可以直接传数组或者类数组
3. bind是为函数绑定一个this上下文
规则: fn.apply(上下文环境,执行所需数组)
fn.call(上下文环境,执行所需单个参数)
fn.bind(上下文环境)
ps:如果上下文的值为null,则使用全局对象代替,相当于没传上下文还用以前的
apply可以将一个数组转换为一个参数列表([p1,p2,p3]转换为p1,p2,p3)

三、
明确绑定 的优先权要高于 隐含绑定
function foo() {
console.log( this.a );
}

var obj1 = {
a: 2,
foo: foo
};

var obj2 = {
a: 3,
foo: foo
};

obj1.foo(); // 2
obj2.foo(); // 3

obj1.foo.call( obj2 ); // 3
obj2.foo.call( obj1 ); // 2
new绑定的优先级高于隐含绑定(new和call/apply不能同时使用,所以new foo.call(obj1)是不允许的,也就是不能直接对比测试 new绑定 和 明确绑定)

四、
请解释 Function.prototype.bind?
Function.prototype.bind方法会创建一个新函数,当这个新函数被调用时,它的this值是传递给bind()的第一个参数, 它的参数是bind()的其他参数和其原本的参数.

五、
请解释变量声明提升 (hoisting)。
变量的声明前置就是把变量的声明提升到当前作用域的最前面。
函数的声明前置就是把整个函数提升到当前作用域的最前面(位于前置的变量声明后面)。

六、
请指出以下代码的区别:function Person(){}、var person = Person()、var person = new Person()?
function Person(){}
声明一个函数Person()。

var person = Person()
将函数Person()的结果返回给变量person,如果没有返回值则person为undefined。

var person = new Person()
new一个Person的实例对象。

七、
var a = 1;
function b() {
console.log(a); // undefined
a = 2;
console.log(a);// 2
var a = 3;
console.log(a);// 3
}
console.log(a);//1
b();
console.log(a);// 1

主要就是要注意b函数里面的var a = 3存在变量提升,所以b函数里面第一个是undefined,
接下来依次赋值打印输出,但是由于是局部变量,所以对全局的a不影响

八、
console.log(foo); // function foo
var foo = ‘A’;
console.log(foo);// A
var foo = function () {
console.log(‘B’);
}
console.log(foo); // function foo
foo();
function foo() {
console.log(‘C’);
}
console.log(foo);
foo();//B

在下面的foo函数会被提升,接下来第一条代码打印出来就是function foo 接下来foo被赋值为A,
所以打印输出为A,之后foo又被赋值为一个函数,所以打印输出为function foo,调用foo,输出B,后面是一样的

九、
var a = b = 3;
(function () {
var a = b = 5; // b=5; var a =b;

})()
console.log(a); //3
console.log(b); // 5

全局里面首先会存在a和b,值都为3,之后进入IIFE后,首先是执行的b = 5,
这个时候就会找到全局的b,将其修改为5,之后是var a = b,
这个a就是局部的a,所以全局的a不会受影响。

十、
var f = true;
if (f === true) {
var a = 10;
}
function fn() {
var b = 20;
c = 30;

}
fn();
console.log(a); // 10
console.log©; // 30
console.log(b); // 报错

执行fn函数以后,在全局上下文里面会生成一个c,局部环境下面会生成一个b,
在fn函数调用完毕之后,b就会被销毁,由于f为true,所以会进入if生成a变量

你可能感兴趣的:(函数相关面试题)