我进行了一次测试面试,对于3个问题,我不知道答案:
编写一个在字符之间插入下划线的函数:这将成为t_h_i_s。
编写一个输出此函数的函数:
l('t') === 'lt'
l()('t') === 'l3t'
l()()('t') === 'l33t'
l()()('g') === 'l33g'
l()()()()()()()()()()()('t') === 'l33333333333t'

var bar = true;
function foo() {
bar = false;
return 5;
function bar() {}
}
foo();
console.log(bar);

有人可以帮忙解答一下吗?
答案 0 :(得分:3)
- 编写一个在字符之间插入下划线的函数:这将成为t_h_i_s。
醇>
您希望编写一个迭代字符串中所有字符的函数,并在所有字符之间附加下划线。
例如:
function underscoreString(str) {
var result = str.charAt(0);
for (var i=1; i<str.length; i++) {
result += '_' + str.charAt(i);
}
return result;
}
console.log( underscoreString('this') );
- 编写一个输出此函数的函数:
醇>
您需要编写一个返回另一个函数的函数,以便链接这些函数。由于Javascript允许您将函数存储为变量,因此可以通过连续重新调用相同的函数来使用它,直到返回正确的参数。
以下功能就是一个例子。它按预期工作,但不是最美丽的。
function l(ch) {
var str = 'l';
if (ch) return str + ch;
else str += '3';
var newFunc = function (ch) {
if (ch) return str + ch;
str += '3';
return newFunc;
}
return newFunc
}
console.log( l('t') === 'lt' );
console.log( l()('t') === 'l3t' );
console.log( l()()('t') === 'l33t' );
console.log( l()()('g') === 'l33g' );
console.log( l()()()()()()()()()()()('t') === 'l33333333333t' );
- 为什么输出是真的?
醇>
var bar = true;
function foo() {
bar = false;
return 5;
function bar() {}
}
foo();
console.log(bar);
函数bar
中的foo()
未引用全局变量bar
。相反,它引用了函数function bar() {}
。这是因为hoisting,如评论中所述。
因此,该函数根本不触及全局bar
变量,并且始终保持为真。
答案 1 :(得分:2)
这实际上取决于预期的代码级别。如果您需要证明对算法的理解或如何使用javascript构造的知识。
例如,第一个可以简单如下:
function insertUnderscore(x){
return x.split('').join('_');
}
第二个问题一个递归方法:
function l( end ){
var acc = '';
function iter( eChar ){
if( typeof eChar === "undefined"){
acc=acc+'3';
return iter;
}
return 'l'+acc+eChar;
}
if(typeof end === "undefined"){
acc = acc + '3';
return iter;
}
return iter(end);
}
第三个问题: function bar(){}实际上声明了&#39; bar&#39;在本地范围内,因此您的作业栏= false会对本地&#39;栏进行操作。
答案 2 :(得分:1)
如果字母未定义,则只返回迭代器函数。当定义字母时,它会重复字符'3'n次。
其他两个应该很容易理解
function l(letter) {
let count = 0
function iter(letter) {
if (typeof letter === 'undefined') {
count++
return iter
} else {
return 'l' + ('3'.repeat(count)) + letter
}
}
return iter(letter)
}
console.log(l('t') === 'lt')
console.log(l()('t') === 'l3t')
console.log(l()()('t') === 'l33t')
console.log(l()()('g') === 'l33g')
console.log(l()()()()()()()()()()()('t') === 'l33333333333t')
答案 3 :(得分:1)
问题1
对字符串的开头使用负向前瞻,为字符使用正向前瞻。用下划线替换给定的空字符串。
function spacer(s) {
return s.replace(/(?!^.)(?=.)/g, '_');
}
console.log(spacer('this'));
&#13;
问题2
使用闭包并返回非给定参数,否则返回扩展值。
function l(v) {
var s = 'l';
fn = function (v) {
s += 3;
return v === undefined ? fn : s + v;
};
return v === undefined ? fn : s + v;
}
console.log(l('t') === 'lt');
console.log(l()('t') === 'l3t');
console.log(l()()('t') === 'l33t');
console.log(l()()('g') === 'l33g');
console.log(l()()()()()()()()()()()('t') === 'l33333333333t');
&#13;
问题3
因为function bar() {}
被提升到函数的开头,然后被false
覆盖。外部bar
变量从未更改过它的内容。
var bar = true;
function foo() {
bar = false;
console.log('foo\'s bar:', bar);
return 5;
function bar() {}
}
foo();
console.log(bar);
&#13;