search

Home  >  Q&A  >  body text

javascript - js函数写法的蛋疼问题

强迫症菜鸟一枚...

function name(num){
    var width = a;
    var default_width = b;
    var scale = b / a;
    var real = Math.ceil(num / scale);
    return real;
}

写一些函数经常会遇到类似的问题,像这个函数我会多次调用.但是前三行其实都是重复计算的.

var width = a;
var default_width = b;
var scale = b / a;
function name(num){
    var real = Math.ceil(num / scale);
    return real;
}

写成上面这种感觉很乱

(function nameVar(){
    var width = a;
    var default_width = b;
    scale = b / a;
}())
function name(num){
    var real = Math.ceil(num / scale);
    return real;
}

最后写成上面这样了

想问一下类似这样的函数有什么好一些的写法?不重复计算,看起来也容易明白.

PHP中文网PHP中文网2818 days ago579

reply all(7)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 14:50:52

    var a = 40, b = 20;
    var cname = {
        width: a,
        default_width: b,
        scale: a / b,
        ceil: function(num) {
            return Math.ceil(num/this.scale)
        }
    }
    
    console.log( cname.ceil(2) );
    

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 14:50:52

    利用立即调用函数表达式闭包的概念.

    var name = (function() {
        var width = a;    // 目测这个变量在你代码中没用哈
        var default_width = b;    // 同上
        var scale = b / a;
    
        return function(num) {
            var real = Math.ceil(num / scale);
            return real;
        };
    }());
    

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:50:52

    var O = {};
    O.config = {
        a: 10,
        b: 20
    };
    O.test = function(data) {
        var config = this.config;
        var scale = (data.a || config.a) / (data.b || config.b);
        return Math.ceil(data.num / scale);
    };
    

    调用:

    // 默认配置
    O.test({
        num: 2
    });
    // 覆盖配置
    O.test({
        num: 2,
        a: 30,
        b: 40
    });
    

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:50:52

    把公用的部分抽取出来放进config对象里。

    var config = {
        default_width: b,
    };
    function name(num, width){
        width = width | a;
        var scale = config.default_width / width;
        var real = Math.ceil(num / scale);
        return real;
    }
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:50:52

    写个高大上的。

    var Cname = function(a, b){
        this.scale = a / b;
    }
    
    Cname.prototype = {
        constructor: Cname,
        ceil: function(num){
            return Math.ceil(num / this.scale);
        }
    }
    
    var test = new Cname(40,  20);
    
    console.log(test.ceil(4));
    

    http://jsfiddle.net/qq273628265/7f79cryh/2/

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 14:50:52

    "use strict";
    
    function User() {
        this.scale = 0;
    }
    User.prototype.name = function(num) {
        var real = Math.ceil(num / this.scale);
        return real;
    }
    
    MyUser = new User();
    
    MyUser.scale = 1;
    var name = MyUser.name(5);
    
    console.log(name);
    

    JavaScript面向对象简介

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 14:50:52

    var GVAR = {};
    GVAR.real = function real (){
        var width = a,
            default_width = b,
            scale = b/a;
        return function( num ){
            return Math.ceil(num/scale);
        }
    }();
    
    GVAR.real(2);
    

    reply
    0
  • Cancelreply