JavaScript之经典面试题
1、作用域经典面试题
var num = 123; // f1函数写好了,作用域就定下来了,也就是作用域链定下来了 // f1函数作用域链: f1函数作用域 ==> 全局作用域 function f1() { console.log(num); // 123 } function f2() { var num = 456; f1(); } f2(); //打印啥?
var num = 123 function f1(num) { // 形参:理解成函数内声明的局部变量 // var num = 实参; 456 console.log(num) // 456 } function f2() { var num = 456; f1(num); // num实参 f1(456) } f2()
var num = 123 function f1(num) { // var num = 实参; // undefined console.log(num); // undefined } function f2() { var num = 456; f1(); } f2()
var num = 123 function f1() { console.log(num); // 123 } function f2() { var num = 456; f1(num); } f2();
细节:
// 1. 预解析(函数内的代码执行之前也要预解析)
// 2. 函数内的形参理解: 理解成函数内声明的局部变量
// 3. 函数作用域在函数写好的时候就已经确定下来了,作用域链就已经定下来了。
var num1 = 10; var num2 = 20; function fn(num1) { // var num3; // 预解析 // var num1 = 实参; // undefined // 形参的理解 num1 = 100; // 修改的局部num1为100; num2 = 200; // 修改的全局num2为200; num3 = 300; // 修改的局部num3为300; console.log(num1); // 100 console.log(num2); // 200 console.log(num3); // 300 var num3; } fn(); console.log(num1); // 10 console.log(num2); // 200 console.log(num3); // error*/
var num = 10; fn1(); function fn1() { console.log(num); // undefined var num = 20; console.log(num); //20 } console.log(num); // 10
-------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------------------
2、预解析经典面试题
function fn1() { // 函数内的代码在执行之前也要经过预解析 var num; // 预解析 console.log(num); // undefined num = 20; // 修改局部num为20 console.log(num); // 20 } var num; num = 10; // 修改全局num为10 fn1(); console.log(num); // 10
var num = 10; fn1(); function fn1() { console.log(num); // 10 num = 20; // 修改全局的num为20 console.log(num); // 20 } console.log(num); // 20
-------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------
封装console.log功能,封装成clg函数
难点:console.log()里面的参数是不定的;封装的clg函数,形参的个数就无法确定
// 以下代码未完成功能,可以在以下代码基础上完成封装功能 function clg(str, str2, str3){ console.log(str, str2, str3); } clg("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿"); // console.log("哈哈", "嘻嘻", "呜呜", "嘤嘤", "嘿嘿"); function clg(){ // console.log(arguments); // 打印arguments整体 // 打印arguments里面的每一项 console.log.apply(arguments, arguments); // 等价于: // arguments.log("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿"); } clg("哈哈", "嘻嘻", "呜呜", "呜呜", "嘤嘤", "嘿嘿");
在以上clg函数基础上增加功能 function clg2(){ // 思路: 给arguments伪数组在头部前面添加 "友情提示:" unshift() // arguments借用unshift方法实现添加功能 [].unshift.call(arguments, "友情提示:"); // console.log( arguments ); // 等价于: // arguments.unshift("友情提示:"); console.log.apply(arguments, arguments); } // clg2("哈哈", "嘻嘻", "呜呜"); // 打印的时候是这样的 "友情提示:" 哈哈 嘻嘻 呜呜 // clg2("aa", "bb", "cc", 10); // 希望:这样调用打印的效果和下面代码效果一样 // clg2("友情提示:", "aa", "bb", "cc"); // 就是封装console.log的时候,第一个参数可以随便写 // call apply的第一个参数是用来修改this指向的 // 求和 function sum(n1, n2){ console.log(n1 + n2); } sum.call(null, 10, 20); sum.apply(undefined, [10, 20]);
注:以上内容均为个人学习时所整理笔记

浙公网安备 33010602011771号